1 const int N=1e7; 2 int phi[N+10],prime[N+10],tot,ans; 3 bool mark[N+10]; 4 void getphi() { 5 int i,j; 6 phi[1]=1; 7 for(i=2;i<=N;i++){ 8 if(!mark[i]){ 9 prime[++tot]=i;//筛素数的时候首先会判断i是否是素数。 10 phi[i]=i-1;//当 i 是素数时 phi[i]=i-1 11 } 12 for(j=1;j<=tot;j++){ 13 if(i*prime[j]>N) break; 14 mark[i*prime[j]]=1;//确定i*prime[j]不是素数 15 if(i%prime[j]==0){//接着我们会看prime[j]是否是i的约数 16 phi[i*prime[j]]=phi[i]*prime[j];break; 17 } 18 else phi[i*prime[j]]=phi[i]*(prime[j]-1);//其实这里prime[j]-1就是phi[prime[j]],利用了欧拉函数的积性 19 } 20 } 21 } 22 //调用时,给出getphi();即可,phi[i]是false说明是素数,否则是合数
每次调用,给出getphi();
打表填充1~n之间的phi[];
原文:https://www.cnblogs.com/St-Lovaer/p/11415515.html