传送门
题目大意
给定两个整数 a , m ( 1 ≤ a < m ≤ 1 0 10 ) a,m\ (1\le a<m\le 10^{10}) a,m (1≤a<m≤1010)。计算满足条件 0 ≤ x < m 0 \le x < m 0≤x<m且 gcd ( a , m ) = gcd ( a + x , m ) \gcd(a,m)=\gcd(a+x,m) gcd(a,m)=gcd(a+x,m)的整数 x x x的个数。
思路
令
d
=
g
c
d
(
a
,
m
)
d=gcd(a,m)
d=gcd(a,m),那么
g
c
d
(
a
d
,
m
d
)
=
g
c
d
(
a
+
x
d
,
m
d
)
=
1
gcd(\frac{a}{d},\frac{m}{d})=gcd(\frac{a+x}{d},\frac{m}{d})=1
gcd(da,dm)=gcd(da+x,dm)=1
那么答案就是
φ
(
m
/
d
)
\varphi(m/d)
φ(m/d)。
代码
ll euler(ll n){
ll res=n;
for(ll i=2;i*i<=n;i++){
if(n%i==0){//i一定是素数
res=res/i*(i-1);//根据公式求得
while(n%i==0) n/=i;
}
}
if(n>1)
res=res/n*(n-1);
return res;
}
ll gcd(ll a,ll b){
return !b?a:gcd(b,a%b);
}
int main(){
int t;
cin>>t;
while(t--){
ll a,m;
scanf("%lld%lld",&a,&m);
ll d=gcd(a,m);
ll ans=euler(m/d);
printf("%lld\n",ans);
}
}