大數組合求逆元的問題

2021-09-12 08:27:31 字數 831 閱讀 9435

前幾天師兄面試碰到乙個t廠的演算法題,影響是5道演算法題,前兩題聽說很簡單,第三題就很難了,下面看一下第三題的內容,具體題目我記不太清楚了,所以我就直接簡化題目 

本文參考:

求c(n,m)mod p

階乘在大二資料結構中就接觸過,基本資料型別基本不能滿足要求,所以要用一下演算法進行簡化

對於正整數 a 和 p,如果有

舉個例子:如果

(a*(b的逆元)%p),組合數的除法就可以得到解決。

因為在演算法競賽中模數p總是質數,所以可以利用費馬小定理 :得到b 的逆元是

求取1到n的階乘對 mod 取模的結果存入陣列 jc 中;

求取 c(n,r) 時, 「費馬小定理+快速冪」求 jc[r]的逆元存入臨時變數

然後計算

求取jc[n - r] 的逆元存入臨時變數

則可以得到

typedef long long ll;

const ll maxn(1000005), mod(1e9 + 7);

ll jc[maxn];

void caljc() //求maxn以內的數的階乘

//費馬小定理求逆元

ll pow(ll a, ll n, ll p) //快速冪 a^n % p

return ans;

}ll niyuan(ll a, ll b) //費馬小定理求逆元

ll c(ll a, ll b) //計算c(a, b)

逆元法求組合數

a b p a p b p a b p a p b p a b p a p b p 但是 a b frac ba p amo dpbm od p frac bmodpa modp 這種時候就要用到逆元 在求組合數時 c nm tbinom mn n m n m frac m n m n p n m ...

盧卡斯 Lucas 定理 逆元 求組合數

參考文章 lucas定理是用來求 c n,m mod p,p為素數的值。lucas定理 我們令n sp q m tp r.q r p 那麼 在程式設計時你只要繼續對 呼叫lucas定理即可。可以遞迴的去完成這個過程,其中遞迴終點為t 0 時間o logp n p ll lucas ll a,ll b...

求逆元的幾種辦法

補了一道cf題,順便看到有人求逆元的方法叼叼的,怪不得人家過題這麼快啊 來總結一發 求a關於n的逆元,即要解同餘方程ax 1 modn 的解x.ax 1 modn ax ny 1 僅當a與n互質時,存在 a 的逆元,利用擴充套件歐幾里得求解。這裡n不一定是素數 ll extend euclid ll...