逆元
1.定義
乘法逆元是一個可以用來進行除法求余的手段,若\(ax\equiv1(mod\;p)\),則稱x為a在mod p意義下的逆元。記為\(a^{-1}\)。於是我們可以簡易的得到在mod p意義下,a的逆元就是它的倒數,於是除就變成了乘,就可以取余了。
注意可以有逆元的前提是\((a,p)=1\)(互質)
2.求解逆元
1)擴展歐幾里得求解乘法逆元
由上述可得,逆元滿足如下式子
看見這個式子我們就可以很顯而易見的想到Exgcd求解。代碼如下
void Exgcd(ll a, ll b, ll &x, ll &y) {
if (!b) x=1,y=0;
else Exgcd(b,a%b,y,x),y-=a/b*x;
}
int NY(int a,int p){
ll x,y;
Exgcd(a,p,x,y);
return (x%p+p)%p;
}
2)費馬小定理求解乘法逆元
由費馬小定理可知\(a^{p-1}\equiv1(mod\;p)\)於是我們可以將式子變形為\(a*a^{p-2}\equiv1(mod\;p)\),所以說在modp意義下\(a^{p-2}\)就是a的逆元,我們使用快速冪求解,此處不給出代碼。
3)遞推求解乘法逆元
對於多個連續的乘法逆元來說,是可以用遞推來求解的。
對於求1~n中的mod p意義下的逆元,首先我們保證n<p(此處暫不解釋原因)。對於一個單獨的i,我們想要求解\(i^{-1}\),於是我們令\(p=ki+r(0<=r<i)\),於是得到\(ki+r\equiv0(mod\;p)\),等式兩邊同時乘上\(i^{-1},r^{-1}\),得到\(kr^{-1}+i^{-1}\equiv0(mod\;p)\),移項可得\(i^{-1}\equiv -\lfloor{p/i}\rfloor*(p\;mod\;i)^{-1}(mod\;p)\),於是我們便得到一個可行的逆元,記\(inv[i]\)為i的逆元,可得遞推式:
但是在具體實現中我們常常為了保證逆元不是一個負數或者防止一些其他的錯誤,我們寫成:
注意:此處我們保證n<p,是因為逆元要求互質!!!
3.例題
[SDOI2008]沙拉公主的困惑
題解鏈接