欧拉函数求法(直接求/筛法)及其应用

1.首先推荐一篇博客,人家不让转载,写的不错。

http://blog.csdn.net/sentimental_dog/article/details/52002608#t1

2.欧拉函数主要是用于求解n以内的与n互质的数目。

phi(n)=n*(1-p1)*(1-p2)*(1-p3).....

p1,p2,p3,p4.....是n的质因数(n不为0);

3

(1)直接求解

int phi(int n)
{
    int ans=n;
    int cph=n;
    for (int i=2;i*i<=ans;i++)
    {
        if (ans%i==0)
        {
            ph=ph/i*(i-1);
            while (ans%i==0)
            {
                ans/=i;
            }
        }
    }
    if (ans!=1) ph=ph/ans*(ans-1);
}

2.筛法求解

  

#define max_ 1000000
int euler[max_];

int phi(int n)
{
    for (int i=1;i<max_;i++)
    {
         euler[i]=i;
    }
    for (int i=2;i<max_;i++)
    {
        if (euler[i]==i)
        {
            for (int j=i;j<max_;j+=i)
            {
                euler[j]=euler[j]/i*(i-1);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/SunQi-lvbu/p/7243950.html