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)