逆元
1.扩欧
int exgcd(int a,int b,int &x,int &y){ if(!b){x=1;y=0;return a;} int r=exgcd(b,a%b,y,x);y-=a/b*x;return r;} int getinv(int a,int mod){ int x,y,d=exgcd(a,mod,x,y); return d==1?(x+mod)%mod:-1;}
2.费马小定理
int qpow(int a,int n,int p){ int s=1;while(n){ if(n&1) s=(s*a)%p; n>>=1;a=(a*a)%p;}return s%p;} int getinv(int a,int p){ return qpow(a,p-2,p);}
3.递推
void getinv(int p){ inv[1]=1; for(int i=2;i<p;i++) inv[i]=(p-p/i)*inv[p%i]%p;}
4.线性阶乘逆元
inv[i]=inv[i+1]*(i+1) 就是给分母乘上个东西,本质很简单
void facinv(){ fac[0]=fac[1]=1; for(int i=2;i<=n;i++) fac[i]=fac[i-1]*i%p; inv[n]=qpow(fac[n],p-2)%p; for(int i=n-1;i>=2;i--) inv[i]=inv[i+1]*(i+1)%p;}