求逆元

线性筛逆元:
inv[1]=1;
for(int i=2;i<=10000008;i++)  inv[i]=(mod-mod/i)*inv[mod%i]%mod;

 

求阶层的逆元

inv[maxn]=qpow(fac[maxn],mod-2);//fac[maxn]为maxn的阶层;
for(ll i=maxn-1;i>=0;i--)
    inv[i]=(inv[i+1]*(i+1))%mod;

 

 
费马小定理:
mod为素数时,求x的逆元:
即x的(mod-2)次方
long long qpow(long long x,long long b){//b=mod-2
    long long ans=1;
    x%=mod;
    while(b){
        if(b&1){
            ans=ans*x%mod;
        }
        x=x*x%mod;
        b>>=1;
    }
    return ans;
}

 

扩展欧几里得求逆元

long long extend_gcd(long long a,long long b,long long &x,long long &y){//扩展欧几里得
    if(!b){
        x=1;y=1;
        return a;
    }
    long long r=extend_gcd(b,a%b,y,x);
    y-=x*(a/b);
    return r;
}
long long inv(long long a,long long mod){
    long long x,y;
    extend_gcd(a,mod,x,y);
    x%=mod;
    if(x<0) x+mod;
    return x;
}

 

posted @ 2018-10-04 21:54  我要见血小板  阅读(171)  评论(0编辑  收藏  举报