D. Same GCDs
对于题目所给的公式
gcd(a,m)=gcd(a+x,m)
由辗转相除我们把第二个式子变一下
gcd((a+x)%m,m)x的取值范围为[0,m) (a+x)%m也是
所以我们可以直接写成 gcd(a,m)=gcd(x,m)
我们设gcd为g k1g=a k2g=m k3*g=x
显然我们对于k3的取值就是不超过k2的与k2互质的数的个数
这里我们直接贴欧拉函数模板就可以了
int fai(int n){
int res=n;
for(int i=2;i<=n/i;i++){
if(n%i==0){
res=res/i*(i-1);
while(n%i==0)n/=i;
}
}
if(n>1)res=res/n*(n-1);
return res;
}
void solve(){
int a,b;cin>>a>>b;
int g=__gcd(a,b);
int k1=a/g,k2=b/g;
cout<<fai(k2)<<endl;
}
标签:Educational,Rated,gcd,int,res,Codeforces,k2
From: https://www.cnblogs.com/ycllz/p/16849038.html