一、逆元是什麼
當我們平常做題遇到需要求類似於(a/b)%p的時候,顯然這個時候不能像做加法和減法一樣展開成((a%p)/(b%p))%p。
這個時候就要用到逆元了。
假設c是b的逆元,那麼就可以得到b*c1(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;
}