题目链接
Solution
这是一道结论题,有两个做法,分别用了欧拉函数或一点点莫比乌斯反演
(这里只放欧拉函数的做法)
设\(d=gcd(m,a)\)
\[gcd(\frac{a}{d},\frac{m}{d})=gcd(\frac{x+a}{d},\frac{m}{d})=1\]
从互质的关系入手进行考虑
所以答案就是\(\varphi(\frac{m}{d})\)
这个东西是可以在时限内求解的
CODE
#include<bits/stdc++.h>
using namespace std;
#define int long long
namespace yspm{
inline int read()
{
int res=0,f=1; char k;
while(!isdigit(k=getchar())) if(k=='-') f=-1;
while(isdigit(k)) res=res*10+k-'0',k=getchar();
return res*f;
}
inline void work()
{
int a=read(),m=read(),ans;
int gcd=__gcd(a,m); m/=gcd; ans=m;
for(int i=2;i*i<=m;++i)
{
if(m%i==0)
{
ans=ans/i*(i-1);
while(m%i==0) m/=i;
}
}
if(m>1) ans=ans/m*(m-1);
return cout<<ans<<endl,void();
}
signed main()
{
int T=read(); while(T--) work();
return 0;
}
}
signed main(){return yspm::main(); }
来源:https://www.cnblogs.com/yspm/p/12255908.html