組合取模問題與Lucas定理

2021-07-24 07:35:17 字數 928 閱讀 3790

組合取模問題是求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 ...