题意 给定a,m 求x在[0,m)中有多少数字满足gcd(a,m) =gcd(a+x,m)
思路:
不管怎么样先化简一下, 令P = gcd(a,m), 于是就是求在[a/P,(a+m)/P)中和m/P互质的数字个数。
在一个区间内求互质个数,很容易想到欧拉函数,但是原来的题面和欧拉函数的定义不同
但是可以发现[a/P,(a+m)/P)的区间长度是m/P-1,所以我们想到在这一段区间内的数减去a/P其实就是就[1,m/P),即我们可以得出[a/P,(a+m)/P)中和m/P互质的数字个数其实就是求m/P的欧拉函数
如果不理解可以把这个区间看成一个循环的一节
#include<bits/stdc++.h>
using namespace std;
const int maxn =1e5+7;
#define ll long long
vector<int>g[30];
ll a,m;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cin>>a>>m;
ll gcd = __gcd(a,m);
ll ans = m/gcd;
ll q = ans ;
for(ll i =2;i*i<=q;i++)
{
if(q%i == 0)ans = ans -ans /i;
while(q%i==0)q/=i;
}
if(q!=1)ans -=ans /q ;
cout<<ans<<endl;
}
return 0 ;
}