CF1295D Same GCDs
前置知识:
- 辗转相除法
- 欧拉函数
首先,根据辗转相除法求
则题目可以转化为:求有多少
等式两边同时除以
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T,a,m;
signed main()
{
scanf("%lld",&T);
while(T--)
{
scanf("%lld%lld",&a,&m);
int n=m/__gcd(a,m);
int ans=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0) ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
cout<<ans<<endl;
}
return 0;
}