數論常用模板部分整理
阿新 • • 發佈:2019-01-28
#pragma comment(linker, "/STACK:102400000,102400000") #include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #define lrt int l,int r,int rt #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define ll long long const int maxn =3e3+5; const int mod=1e9+7; ll gcd(ll x,ll y){return y==0?x:gcd(y,x%y);} ll powmod(ll x,ll y){ll t;for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod;return t;} ///擴充套件歐幾里得求逆元 void exgcd(ll a,ll b,ll &d,ll &x,ll &y) { if(b==0) { d=a; x=1; y=0; return ; } exgcd(b,a%b,d,y,x); y-=x*(a/b); } ll Inv(ll a,ll n){ ll d,x,y; exgcd(a,n,d,x,y); return d == 1 ? (x+n)%n : -1; } ///階乘逆元+求階乘組合數 ll fac[maxn],inv[maxn]; void init() { fac[0]=inv[0]=1; for(int i=1;i<maxn;i++) fac[i]=fac[i-1]*i%mod; inv[maxn-1]=powmod(fac[maxn-1],mod-2)%mod; for(int i=maxn-2;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod; } inline ll C(ll n,ll m) { if(m>n) return 0; return fac[n]*inv[m]%mod*inv[n-m]%mod; } ///mod為質數的情況下的特殊逆元線性求法 ll inv[maxn]; void get_inv() { inv[1]=1; for(int i=2;i<maxn;i++) inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod; } ///篩法篩尤拉函式,莫比烏斯函式,質數 int vis[maxn],miu[maxn],phi[maxn]; int prim[maxn],cnt=0; void sieve() { int N=maxn-1; memset(vis,0,sizeof(vis)); memset(miu,0,sizeof(miu)); for(int i=2;i<=N;i++; { if(!vis[i]) { prim[cnt++]=i; miu[i]=-1; phi[i]=i-1; } for(int j=0;j<cnt;j++) { ll k=1LL*i*prim[j]; if(k>N) break; vis[k]=1; if(i%prim[j]) { phi[k]=phi[i]*(prim[j]-1); miu[k]=-miu[i]; } else { phi[k]=phi[i]*prim[j]; break; } } } }