线性素数筛:
1 不管i是不是素数,它与素数的乘积一定不是素数,直接use =1;
2 如果use=0那么i是素数加入到ss表中,然后枚举素数表,执行操作1,如果i是合数,如果素数表中有它的质因数,则说明已经被质因数筛过了,直接break即可 (我也很迷啊
void pd() { use[1]=1; for(int i=2;i<=n;i++) { if(use[i]==0); a[++k]=i; for(int j=1;j<=k&&i*a[j]<=n;j++) { use[i*a[j]]=1; if(i%a[j]==0) break; } } return ; }
线性求欧拉函数:
欧拉函数性质
1:因为欧拉函数是积性函数雾,如果i与p互质则有 ph (i*p) =ph i *ph p i%p!=0
2:ph i*p=ph i* p i%p==0不论p是不是质数
这样就可以枚举出所有情况下的欧拉函数
边线性筛边算欧拉函数:
void get_phi() { for(int i=1;i<=N-3;i++) phi[i]=i; use[1]=1; for(int i=2;i<=N-3;i++) { if(use[i]==0) { ss[++k]=i; phi[i]=i-1; } for(int j=1;j<=k&&i*ss[j]<=N-3;j++) { int temp=i*ss[j]; use[temp]=1; if(i%ss[j]==0)//i是ss的倍数 { phi[temp]=phi[i]*ss[j]; break; } else { phi[temp]=phi[i]*(ss[j]-1); } } } }