Codeforces 1295D - Same GCDs 题解

FML

题解 #

g=gcd(a,m)g= \gcd(a,m),所以我们有a=gkm=gl,gcd(l,k)=1a=g\cdot k,m=g\cdot l,\gcd(l,k)=1,不难发现,如果我们想要使gcd(a,m)=gcd(a+x,m)\gcd(a,m)=\gcd(a+x,m)xx必须是gg的倍数,设x=ngx=n\cdot g。而且,k+nk+nll必须要互质,所以我们要找到从kkk+lk+l中与ll互质的数的个数。对于那些大于ll的数,如果 gcd(k+x,l)=1\gcd(k+x,l)=1那么gcd((k+x)modl,l)=1\gcd((k+x)\bmod l,l)=1。又因为(k+x)modl<l(k+x)\bmod l< l ,所以我们真正要算的是比ll小并且与ll互质的数的个数,也就是φ(l)\varphi(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;
}