欧拉函数

来源:互联网 发布:程序员出差是去干什么 编辑:程序博客网 时间:2024/06/11 22:54

φ(n)=n(11p1)(11p2)...(11pk)
对于质数pφ(p)=p1
其中p1,p2pnn的所有质因数,n是不为0的整数。
欧拉函数是积性函数——若m,n互质, f(nm)=f(n)f(m)
(注:素数线性筛)

/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数int make(){    phi[1]=1;    int N=maxn;    int k;    for(int i=2;i<N;i++)    {        if(!m[i])//i是素数            p[pt++]=m[i]=i,phi[i]=i-1;        for(int j=0;j<pt&&(k=p[j]*i)<N;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)        }    }}//其实就是在素数线性筛上动动手脚就好了~
0 0
原创粉丝点击