Codeforces 1295D Same GCDs

牧云@^-^@ 提交于 2020-02-03 17:29:14

题目链接

link

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(); } 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!