求解欧拉函数

void getphi()
{
    phi[1]=1;
//起始赋一(1内与1互质的数)
    for(int i=2;i<=n;i++)
    {
        if(!mark[i]){phi[i]=i-1;pri[++tot]=i;}
//求质数
        for(int j=1;j<=tot;j++)
        {
            int x=pri[j];
            if(i*x>n)break;
            mark[i*x]=1;
            if(i%x==0){phi[i*x]=phi[i]*x;break;}
                          //p(的k次方型欧拉函数变换) 
                    //欧拉性质
            else phi[i*x]=phi[i]*phi[x];(i,x互质)
        }
    }
}    

 

注意,在求大数的欧拉函数时,超过根号n的质数要特判(p-1)

 

posted @ 2019-10-09 19:37  凉如水  阅读(124)  评论(0编辑  收藏  举报