逆元

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;}

                          

 

posted @ 2018-10-02 10:03  ASDIC减除  阅读(118)  评论(0编辑  收藏  举报