线性素数筛
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); } } } }
求单个的欧拉函数
inline long long phi(long long x) { long long s=x,i=2; for (;i*i<=x;i++) if (!(x%i)) {s=s/i*(i-1); for (;!(x%i);x/=i);} if (x>1) s=s/x*(x-1); return s; }
gcd
顺便贴一下gcd吧(虽然可以用__gcd(a,b)这个自带函数)
long long gcd(long long a,long long b) { return b?gcd(b, a % b):a; }