题目:传送门
题目大意:gcd(a,m)=gcd(a+x,m),给定a,m,问x的个数是多少。
解题思路:
令d=gcd(a,m)=gcd(a+x,m),则gcd((a+x)/d,m/d)=1,
此时,令t1=(a+x)/d,t2=m/d,则gcd(t1,t2)=gcd(t2,t1%t2)=1。
又(t1%t2)<t2,而a,d是确定的,故有多少个小于t2且与t2互质的数就有多少个对应的x,所以问题转化为求小于t2且与t2互质的个数。显然是用欧拉函数求解。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll phi(ll n)
{
ll ans=n;
for(ll 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);
return ans;
}
void work()
{
ll a,m;
scanf("%lld%lld",&a,&m);
ll d=__gcd(a,m);
ll t2=m/d;
printf("%lld\n",phi(t2));
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
work();
return 0;
}