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();即可,mark[i]是false说明是素数,否则是合数
每次调用,给出getphi();
打表填充1~n之间的mark[];
再更新一个在线判定素数的吧,有时候会用。
1 bool isPrime(int num){ 2 if(num==2||num==3) return true; 3 if(num%6!=1&&num%6!=5) return false; 4 for(int i=5;i*i<=num;i+=6){ 5 if(num%i==0||num%(i+2)==0)return false; 6 } 7 return true; 8 }