組合取模問題是求cm
n mod p的問題 cm
n mod p可以寫成n!
(n−m
)!m!
(modp)
這樣的形式。
結合逆元和費馬小定理(ap
−1≡1
(modp)
),有:
=>a∗
ap−2
≡1(modp)
=>ap
−2為a
(modp)
的乘法逆元
=>ba
≡b∗a
p−2(
modp)
上述結果就變成了n!
∗((n
−m)!
m!)p
−2(modp)
對於n、m不大的資料可以用這種方法(大概106
左右)
而更大的資料這樣就會超時,所以這裡需要用到乙個叫做lucas的定理:
首先將n和m分解為p進製: n=
nk∗p
k+nk
−1∗p
k−1.
..n1
∗p1+
n0∗p
0 m=
mk∗p
k+mk
−1∗p
k−1.
..m1
∗p1+
m0∗p
0 lucas定理說的是: cm
n≡∏i
=0kc
mini
(modp)
(這裡就不進行證明了+_+)
然後再用上面的做法求解。
這裡有乙個要求是p不能太大(大約是106
),因為p不是很大可以保證通過lucas定理轉化過後的ni
和mi 都不是很大從而可以用上面的做法。這裡的n 和
m資料範圍可以是101
8 次方左右。
Lucas定理 組合數取模
a b是非負整數,p是質數。ab寫成p進製 a a n a n 1 a 0 b b n b n 1 b 0 則組合數c a,b 與c a n b n c a n 1 b n 1 c a 0 b 0 modp同餘 即 lucas n,m,p c n p,m p lucas n p,m p,p 然而如果...
組合數取模介紹 Lucas定理介紹
1.當n,m都很小的時候可以利用楊輝三角直接求。c n,m c n 1,m c n 1,m 1 const int maxn 1e5 10 ll fac maxn 階乘打表 void init ll p 此處的p應該小於1e5,這樣lucas定理才適用 ll pow ll a,ll b,ll m a...
組合數取模(楊輝三角 Lucas定理 模合數)
1 1 m n 1000 和 1 p 10 9 p可以是任何數 這個問題比較簡單,組合數的計算可以靠 楊輝三角 那麼由於和的範圍小,直接兩層迴圈即可。long long c maxn maxn void comb int n,int m,int p 1 m n 10 18 和 2 p 10 5 p ...