標籤:abs 歐拉 span turn nlog [1] 公約數 www bool
數論模板
此處均為代碼,學習出門右轉
一、公約數、公倍數GCD
int gcd(int x,int y){ return !y?x:gcd(y,x%y);}
LCM
int lcm(int x,int y){ return x/gcd(x,y)*y;}
拓展歐幾裡得
int x,y;int ex_gcd(int a,int b){ if(!b){ x=1,y=0;return a; } int temp=ex_gcd(b,a%b); x=y,y=temp-a/b*y; return temp;}
二、篩素數埃拉托色尼篩法
int cnt,prime[maxn];bool not_pr[maxn];void Get_Prime(int x){ not_pr[1]=1; for(int i=2;i<=x;++i) if(!not_pr[i]){ prime[++cnt]=i; for(int j=i*i;j<=x;j+=i) not_pr[j]=1; }}
線性篩
int cnt,prime[maxn];bool not_pr[maxn];void Get_Prime(int x){ not_pr[1]=1; for(int i=2;i<=x;++i){ if(!not_pr[i]) prime[++cnt]=1; for(int j=1;j<=cnt&&i*prime[j]<=n;++j){ not_pr[i*prime[j]]=1; if(i%prime[j]==0) break; } }}
在\(O(nlogn)\)時間內篩除n以內所有數的素因子
int cnt,prime[maxn],pre[maxn];bool not_pr[maxn];void Get_Prime(int x){ not_pr[1]=1; for(int i=2;i<=x;++i){ if(!not_pr[i]) prime[++cnt]=i; for(int j=1;j<=cnt;++j){ if(i*prime[j]>x) break; not_pr[i*prime[j]]=1,pre[i*prime[j]]=j; if(i%prime[j]==0) break; } }}void Get_Ans(int x){ for(int i=1;i<=x;++i){ printf("%d:",i); int di=i; while(di!=1) printf("%d",prime[pre[di]]),di/=prime[pre[di]]; }}
三、求歐拉\(φ\)函數埃拉托色尼篩法
int cnt,prime[maxn],phi[maxn];bool not_pr[maxn];void euler(int x){ for(int i=1;i<=x;++i) phi[i]=i; for(int i=2;i<=x;++i) if(!not_pr[i]){ prime[++cnt]=i,phi[i]=i-1; for(int j=i*i;j<=x;++j){ not_pr[j]=1,phi[j]=phi[j]/i*(i-1); } }}
歐拉篩
int cnt,prime[maxn],phi[maxn];bool not_pr[maxn];void euler(int x){ phi[1]=1,not_pr[1]=1; for(int i=2;i<=x;++i){ if(!not_pr[i]) prime[++cnt]=i,phi[i]=i-1; for(int j=1;j<=cnt;++j){ if(i*prime[j]>x) break; not_pr[i*prime[j]]=1; if(!(i/prime[j])) phi[i*prime[j]]=phi[i]*prime[j]; else phi[i*prime[j]]=phi[i]*(prime[j]-1); } }}
四、求逆元單個數求逆元
int x,y;int ex_gcd(int a,int b){ if(!b){ x=1,y=0;return a; } int temp=gcd(b,a%b); x=y,y=temp-a/b*y; return temp;}int cal(int a,int m){//ax%m==1,求最小的x int Gcd=gcd(a,m); if(1%Gcd!=0) return -1; x*=1/Gcd,m=abs(m); int ans=x%m; if(ans<=0) ans+=m; return ans;}
快速冪求逆元
若\(p\)為質數,\(a^{(p-1)}~ mod ~p=1,a\)的逆元為\(a^{(p-2)}\);若\(p\)不是質數,\(a^{phi[p]} ~mod ~p=1\),\(a\)的逆元為\(a^{phi[p]-1}\)。
線性篩逆元
int inv[maxn];void Get_inv(int x){ inv[1]=1; for(int i=2;i<=x;++i) inv[i]=(p-p/i)*inv[p%i]%p;}
快速冪快速冪
int qpow(int x,int k){ int a=1; while(k){ if(k&1) a*=x; x*=x; k>>=1; } return a;}
取膜快速冪
int powmod(int a,int k,int p){ long long a=1; while(k){ if(b&1) a=1ll*a*x%p; x=1ll*x*x%p; k>>=1; } return a;}
組合數
void init_C(){ for(int i=0;i<=n;++i) c[i][0]=1; for(int i=1;i<=n;++i) for(int j=1;j<=i;++j) c[i][j]+=c[i-1][j-1]+c[i-1][j];}
數論代碼整理