ICPC模板 取模逆元(模反元素)

2021-09-10 17:53:42 字數 722 閱讀 1026

目錄

取模逆元(模反元素)

互素情形

非互素情形

抽象代數中的逆元指的是,對於現有的乙個集合s以及定義在其上的二元運算r,任意元素與其逆元進行這個運算後可以得到單位元。

取模逆元的條件定義在同余式的乘法下,即對於兩個整數a和b,如果有:

則將b稱作a的逆元,同時a也是b的逆元。

取模逆元常常用在計算取模表示式時有除法的情況,因為取模運算對除法不具有分配律,對於形如(u / v) % n的情形,考慮到u / v等價於u * (1 / v),即u * v^-1【備註:此處的^表示冪次】,顯然有v * v^-1 = 1,且在同余式的情況下仍然成立,那麼可以預先計算v模除n的逆元,在需要除以v時乘上v的模n逆元。

計算乙個數的取模逆元需要用到費馬小定理(當模除的數為素數時)或尤拉定理(題目中通常模除的數會是1e9 + 7這個素數,因此可以使用費馬小定理來計算取模逆元)。

計算方法:

其中p是素數。

原理是:

第二個同餘號部分使用了費馬小定理。

如果p不是素數,則需要使用尤拉定理,將p – 1替換成φ(p)。

對於將逆元用在代替除法的情景下, 可以對模數p進行質因數分解,之後將需要取逆元的數的所有與p相同的因子分離出來,並且記錄個數,剩下的與p互質的部分求取逆元,使用時分兩步,逆元部分直接乘,分離出的公因子部分做減法(分子上這個公因子的個數減去分母上的個數),之後用快速模冪法,將結果乘回去。

模板 組合數取模

n le 2000,m le 2000 直接利用遞推式預處理即可。如下 include using namespace std const int mod 1e9 7 int main for int i 1 i 2000 i while n return 0 n,m le 1e5 預處理出階乘和階...

快速冪取模演算法 模板

快速冪取模其實是a b c,這就是著名的rsa公鑰加密的方法,當a,b都很大的時候,直接求是不可取的,所以就用到了快速冪取模。首先你得明白他的原理,其實是用到了二分的思想,把b按照二進位制展開 b p n 2 n p n 1 2 n 1 p 1 2 p 0 其中p i 0 i n 為 0 或 1。所...

快速冪取模演算法模板

在miller rabbin測試素數,就用到了快速冪取模的思想。這裡總結下。求a b c 這就是著名的rsa公鑰的加密方法 當a,b很大時,直接求解這個問題不太可能 演算法1 利用公式a b c a c b c,這樣每一步都進行這種處理,這就解決了a b可能太大存不下的問題,但這個演算法的時間複雜度...