逆元

一、逆元是什麼

   當我們平常做題遇到需要求類似於(a/b)%p的時候,顯然這個時候不能像做加法和減法一樣展開成((a%p)/(b%p))%p。

這個時候就要用到逆元了。

假設c是b的逆元,那麼就可以得到b*c\equiv1(mod p),那麼上式就可以寫成

(a/b)*1 %p=(a/b)*b*c%p=(a*c)%p

這樣我們就把除法取模問題轉化成乘法取模問題了。

二、求逆元

1、費馬小定理

內容:如果p是一個質數,而整數a不是p的倍數,則有a^(p-1)≡1(mod p)

那麼上式就等於a*a^(p-2)≡1(mod p),即a得逆元就是a^(p-2).

再利用快速冪就可以求得。

複雜度 O(logn)

const int mod=1000000007;
const int N=1e5+10;
// 費馬小定理
ll qsm(ll a,ll b)
{
    if(b<0)
        return 0;
    ll ans=1;
    a%=mod;
    while(b){
        if(b&1)
            ans=(ans*a)%mod;
        b>>=1;
        a=(a*a)%mod;
    }
    return ans;
}
ll inv1(ll a)
{
    return qsm(a,mod-2);
}

2、逆元線性篩

這個可以求一系列的數的逆元,要求p爲質數

複雜度O(n)

const int mod=1000000007;
const int N=1e5+10;
ll inv[N];
ll inv2()
{
    inv[1]=1;
    for(int i=2;i<10000;i++)
        inv[i]=inv[mod%i]*(mod-mod/i)%mod;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章