抄的别人博客的欧拉函数的板子.
好的.出处我也不清楚...抱歉...
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]] } } }