【算法】【数学】

1 阅读1分钟

因数相关

C. Physical Education Lesson(1500)

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll ced(ll m,ll l){
	ll res=0;
	for(ll i=1;i*i<=m;i++){
		if(m%i==0){
			if(i%2==0&&i>=l){res++;
			}ll j=m/i;
			if(j!=i&&j%2==0&&j>=l)res++;
		}
	}return res;
}
//需要找到有多少个不同的 k 值,能满足方程 (2k-2)t+x=n(存在某个非负整数 t)。
//不难发现,该等式成立当且仅当 n-x 能被 2k-2 整除。
//因此,我们需要先找出数字 n-x 的偶数除数的数量。


//(2k-2)+t+2k+x → 
//整理得 n+x-2=(2k-2)?(t+1) → 2k-2 是 n+x-2 的约数。
int main(){
	int t;cin>>t;
	while(t--){
		int n,x;
		cin>>n>>x;
		ll d=n-x;
		ll l1=max(2ll,2ll*(x-1));
		ll cnt1=ced(d,l1);
		ll cnt2=0;
		ll e=n+x-2;
		if(x>=2){
			ll l2=2ll*x;
			cnt2=ced(e,l2);
		}cout<<cnt1+cnt2<<'\n';
	}
}