欧拉函数

来源:互联网 发布:战地1狙击枪数据 编辑:程序博客网 时间:2024/05/16 02:34

这里面有详细的解释

/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数表,pt是素数个数,phi[i]是i的欧拉函数int make(){    phi[1]=1;    int k;    for(int i=2;i<maxn;i++)    {        if(!m[i])//i是素数            p[pt++]=m[i]=i,phi[i]=i-1;        for(int j=0;j<pt&&(k=p[j]*i)<maxn;j++)        {            m[k]=p[j];            if(m[i]==p[j])//为了保证以后的数不被再筛,要break            {                phi[k]=phi[i]*p[j];/*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/                break;            }            else                phi[k]=phi[i]*(p[j]-1);//积性函数性质,f(i*k)=f(i)*f(k)        }    }}

单个数的欧拉值

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define LL long longusing namespace std;LL get_eular(LL n){    LL ans=n;    for(int i=2;i*i<=n;i++)    {        if(n%i==0)        {            ans-=ans/i;            while(n%i==0)                n/=i;        }    }    if(n>1) ans-=ans/n;    return ans;}int main(){    LL n;    while(~scanf("%lld",&n))    {        printf("%lld\n",get_eular(n));    }}
原创粉丝点击