CF1928C (数学思想)

wuhupai / 2024-02-27 / 原文

难度3

其实是有点虚高的,可能是我这种数学题做的少了。在考试时式子都写出来了,但不知道怎么处理。然后注意一下细节就可以了。懒懒懒。对于xy=k(k为常数)可以直接枚举k的因子,然后看一下限制条件即可。

#include<bits/stdc++.h>
using namespace std;
long long T,n,x,tot=0;
unordered_map <long long,long long> mp;
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin>>T;
	while(T--){
		mp.clear(); 
		tot=0;
		cin>>n>>x;
		long long g1=n-x,g2=n+x-2;
		for(long long k=1;k*k<=g1;k++){
			if(g1%k==0){
				if(k%2==0&&(k+2)/2>=x&&mp[(k+2)/2]==0){
					mp[(k+2)/2]=1;
					tot++;
					//cout<<(k+2)/2<<endl;
				}if((g1/k)%2==0&&(g1/k+2)/2>=x&&mp[(g1/k+2)/2]==0){
					mp[(g1/k+2)/2]=1;
					tot++;//cout<<(g1/k+2)/2<<endl;
				}
			}
		}
		for(long long k=1;k*k<=g2;k++){
			if(g2%k==0){
				if(k%2==0&&mp[(k+2)/2]==0&&(k+2)/2>=x){
					tot++;//cout<<(k+2)/2<<endl;
				}if((g2/k)%2==0&&mp[(g2/k+2)/2]==0&&(g2/k+2)/2>=x){
					tot++;//cout<<(g2/k+2)/2<<endl;
				}
			}
		}
		cout<<tot<<"\n";
	}
	
	return 0;
}
/*
1
5 1
*/