欧拉函数

 

 

抄的别人博客的欧拉函数的板子.

好的.出处我也不清楚...抱歉...

 

 

const int maxnn2 = maxn * 2;
int isprime[maxnn2],phi[maxnn2],p[maxnn2],nump;
//m[i]标记i是否为素数,0为素数,1不为素数;p是存放素数的数组;nump是当前素数个数;phi[i]为欧拉函数
void make(int maxnn)
{
    phi[1]=1;
    for (int i=2;i<=maxnn;i++)
    {
        if (!isprime[i])//i为素数
        {
            p[++nump]=i;//将i加入素数数组p中
            phi[i]=i-1;//因为i是素数,由特性得知    
        }    
        for (int j=1;j<=nump&&p[j]*i<maxnn;j++)  //用当前已的到的素数数组p筛,筛去p[j]*i
        {
            isprime[p[j]*i]=1;//可以确定i*p[j]不是素数 
            if (i%p[j]==0) //看p[j]是否是i的约数,因为素数p[j],等于判断i和p[j]是否互质 
            {
                phi[p[j]*i]=phi[i]*p[j]; //特性2
                break;
            }
            else phi[p[j]*i]=phi[i]*(p[j]-1); //互质,特性3其,p[j]-1就是phi[p[j]]   
        }
    }
}

 

posted @ 2018-08-22 14:21  过路人1998  阅读(123)  评论(0编辑  收藏  举报