前幾天師兄面試碰到乙個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...