#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll m)//辗转相除法求最大公约数
{
ll b;
while(m%a){
m%=a;
b=m,m=a,a=b;
}
return a;
}
ll Get_phi(ll n)//欧拉定义法求phi(n)
{
ll phi=n;
for(ll i=2;i*i<=n;i++){
if(n%i==0) {
phi*=(i-1.0)/i;
while(n%i==0) n/=i*1.0;
}
}
if(n>1) phi*=(n-1.0)/n;
return phi;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("3999.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
ll a,m,b;
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%lld%lld",&a,&m);
b=gcd(a,m);
b=Get_phi(m/b);//题意为求(m/最大公约数)的欧拉值
printf("%lld\n",b);
}
return 0;
}
AcWing 3999. 最大公约数代码实现,今日份学习



京公网安备 11010502036488号