今天來講講乘法逆元。
首先是模板題鏈結
首先,乘法逆元的定義還是簡單說一下:
若在mod p意義下,對於乙個整數a,有\(a\times b≡1(mod p)\),那麼這個整數d即為a的 乘法逆元,同時a也為d的乘法逆元然後主要是**實現。
我們分為兩種種情況來求乘法逆元
一、擴充套件歐幾里得
已經在擴充套件歐幾里得演算法講過了,這種演算法也是較少無規律數演算法中較快的一種。
二、費馬小定理。
費馬小定理:
當\(p\)為質數時,對於任意整數\(a\),滿足\(a^p-a\)是\(p\)的整數倍,在\(\mod p\)意義下可以表示為:
\[\begin
a^p-a \equiv 0\pmod\\
a^p \equiv a\pmod \\
a^\equiv 1\pmod\\
a\times a^\equiv 1\pmod
\end
\]所以很明顯,只需要算出\(a^\mod p\)就是\(a\)在\(\mod p\)意義下的逆元,用快速冪算出來就可以了。
很明顯,這種要求這麼多數字的逆元的題目,不能再簡單地挨個單個算它的逆元了。
這個時候就需要一種演算法,能夠在很短的時間內求出這一連串數字在\(\mod p\)意義下的逆元,所以就出現了這種線性演算法
它能夠用\(o(n)\)的時間複雜度來求出1~n的每乙個逆元。
首先 \(1^\equiv 1\pmod \)(既然\(p\)是質數那麼\(p\)一定是\(≥2\)的整數)
然後設 \(p=k*i+r,(1也就是 \(k\) 是 \(p / i\) 的商,\(r\) 是餘數 。
再將這個式子放到\(\pmod p\)意義下就會得到:
\(k*i+r \equiv 0 \pmod p\)
然後乘上\(i^,r^\)就可以得到:
\(o(n)\)遞推公式:
inv[i]=(p-p/i)*inv[p%i]%p;
inv[1]
初值賦\(1\).
ov.
乘法逆元及逆元求法
模運算 取餘運算,即a除以b得到的餘數,記為mod,又記為 模運算過程中,加減乘都可以先對a,b進行 p,然後再進行加減乘,最後再 p,結果不變 運算子優先順序,模運算和乘除法的運算子優先順序是一樣的 同餘 a和b除以p得到的餘數相同,即p可以整除 a b 求解 cfrac mod p 的值,因為除...
模板 乘法逆元
適用 求某乙個數在模意義下的乘法逆元。如果a p互質,那麼有ap a就是p的倍數,所以有ap a modp ap 1 1 modp 所以只要打乙個快速冪就ok了。code include using namespace std int n,p int power int x,int k return...
模板 乘法逆元
這是一道模板題 給定n,p求1 n中所有整數在模p意義下的乘法逆元。輸入格式 一行n,p 輸出格式 n行,第i行表示i在模p意義下的逆元。輸入樣例 1 複製10 13 輸出樣例 1 複製179 108112 534 1 n 3 106,n1 n 3 106,n輸入保證 p p p 為質數。先扔個線性...