Educational Codeforces Round 81 (Rated for Div. 2) D

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;
}
posted @ 2022-11-01 20:24  ycllz  阅读(25)  评论(0)    收藏  举报