逆元inv詳細整理

2022-04-07 05:54:06 字數 2022 閱讀 6833

個人筆記,僅供複習

1.1 定義:逆元素是指乙個可以取消另一給定元素運算的元素,在數學裡,逆元素廣義化了加法中的加法逆元和乘法中的倒數。

1.2 數論中定義:如果滿足公式,a*b = 1(mod p),則a是b的逆元,同時b也是a的逆元。

1.3 另一種定義:a*x  = 1 (mod p),其中a與p互質,則稱x的最小整數為a關於p的逆元。

2.1 除法模運算:設c為b在對p取模狀態下的逆元,在求(a/b)%p時,很可能會因為b過大而超過精度範圍,這時候可以將除法轉換成乘法來做,(a/b)%p = (a*b)%p = (a%p)*(b%p)%p

費馬小定理:若p為素數,則有推論:

故就是a關於p的乙個逆元

3.1.1**例項:

#include#includeusing namespace std;

const int maxn = 100010;

const int mod = 1e5+7;

typedef long long ll;

ll finv[maxn];

ll qpow(ll x,ll p,ll m)

return res;

}void init()

int main()

3.1.2 複雜度分析:求單個逆元的時間複雜度是lg(mod)

求a關於1模p的逆元,可以轉化為a*x = 1+k*p,其中x與p都是整數,這樣x即為所求逆元。

這樣就可以轉化為拓展歐幾里得演算法(要求a與p互質):a*x + k*p = 1;

遞推式:inv[i] = (mod-mod / i) * inv[mod% i]%mod推倒:假設t = mod / i(向下取整),k = mod % i,那麼t * i + k = mod;

因為;等式兩邊同時除 i * k,得:

;移項,得:

;即inv[i] = (-mod/i)*inv[mod% i]%mod

如果要保證結果為正:inv[i] = (mod-mod / i) * inv[mod% i]%mod

3.3.1 **例項:

#include#includeusing namespace std;

typedef long long ll;

const int maxn = 100010;

const int mod = 1e5+7;

ll inv[maxn];

void inv()

}int main()

3.3.2 演算法複雜度分析:線性時間遞推,時間複雜度o(lg n)

3.3.3 求 n! 逆元:

inv[i] = inv[i+1] * (i + 1) % mod

#include#includeusing namespace std;

const int maxn = 100010;

const int mod = 1e9+7;

typedef long long ll;

ll finv[maxn],f[maxn];//f存階乘,finv存對應逆元

ll qpow(ll x,ll p,ll m)

return res;

}void init()

int main()

httpsession 詳細內容整理

最近在做登入和許可權控制模組,用到了session,發現session的好多方法都不熟悉,而且以前也聽說過jsessionid 之類session竊取的事,對這些一直都是一知半解。今天索性google了很多資料,先上sun的官網去看session的文件了解一些方法,又找了 別人關於session的看...

httpsession 詳細內容整理

最近在做登入和許可權控制模組,用到了session,發現session的好多方法都不熟悉,而且以前也聽說過jsessionid 之類session竊取的事,對這些一直都是一知半解。今天索性google了很多資料,先上sun的官網去看session的文件了解一些方法,又找了別人關於session的看法...

C String類詳細整理

string簡介 string語法基礎 輸出測試 1 string的比較操作 string類的常用建構函式 string類的常用函式 1 引入標頭檔案 string要使用先引入標頭檔案 include 注意這裡的是string,學了c的同學請注意,不是string.h 底層 是一種順序表的結構,元素...