FML 题解 # 让g=gcd(a,m)g= \gcd(a,m)g=gcd(a,m),所以我们有a=g⋅k,m=g⋅l,gcd(l,k)=1a=g\cdot k,m=g\cdot l,\gcd(l,k)=1a=g⋅k,m=g⋅l,gcd(l,k)=1,不难发现,如果我们想要使gcd(a,m)=gcd(a+x,m)\gcd(a,m)=\gcd(a+x,m)gcd(a,m)=gcd(a+x,m), xxx必须是ggg的倍数,设x=n⋅gx=n\cdot gx=n⋅g。而且,k+nk+nk+n和lll必须要互质,所以我们要找到从kkk到k+lk+lk+l中与lll互质的数的个数。对于那些大于lll的数,如果 gcd(k+x,l)=1\gcd(k+x,l)=1gcd(k+x,l)=1那么gcd((k+x) mod l,l)=1\gcd((k+x)\bmod l,l)=1gcd((k+x)modl,l)=1。又因为(k+x) mod l<l(k+x)\bmod l< l (k+x)modl<l,所以我们真正要算的是比lll小并且与lll互质的数的个数,也就是φ(l)\varphi(l)φ(l)。 Code # #include <bits/stdc++.h> using namespace std; typedef long long ll; ll Phi(ll m){ ll ans=m; for(ll i=2;i*i<=m;i++){ if(m%i==0){ ans-=ans/i; while(m%i==0) m/=i; } } if(m>1) ans-=ans/m; return ans; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tt; cin>>tt; while(tt--){ ll a,m; cin>>a>>m; cout<<Phi(m/gcd(a,m))<<endl; } return 0; }