Lucas 大組合數

2022-04-01 07:01:58 字數 1142 閱讀 7559

題目:hdu 3037

題意:有n個樹,m個堅果,放到n個樹裡,可以不放完,有多少種方法。

分析:

得到組合數了。

大組合數什麼費馬小定理,lucas定理都來了;

總的說,不能用二維地推了,用的卻是組合數的定義。

一般來說大組合通常要取模。

那麼不能邊乘邊模,邊除邊模,等式不會成立。

根據逆元,除以乙個數取模 = 乘以這個數對mod的逆元。

那麼式子就可以寫成:

這裡,我們可以預處理所有 i 對 mod 的逆元後,累乘,這樣得到的就是階乘的逆元。

然後就是求 i 對 mod 的逆元了,什麼擴充套件歐幾里得就來了。

當然,有費馬小定理。

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

整個求大組合數就是這樣出來了。

void

init()

ll c(ll n,ll m)

但是這個題目n,m的範圍驚人1000000000,作為階乘,逆元,陣列開不下。

lucas來了:

看結果吧:

還是有組合數,用了費馬定理:

fac[n]*inv(fac[m])%p*inv(fac[n-m])%p;

因為這裡的對p的逆元 inv已經不能用陣列表示和地推了,inv()函式,利用了費馬定理,快速冪等等,原理很複雜了,哈哈~~~,我就不證明了。

void initfac(int

n) ll pow(ll a,

intb)

ll inv(ll a)

ll c(ll n,ll m)

ll lucas(ll n,ll m)

Lucas 組合數取模

組合數取模就是求 cn mmod p cmn modp 的值,當然根據n,m,p n,m p 的取值範圍不同,採取的方法也不一樣。p p 比較大就只能乙個乙個算如 ll c one by one ll n,ll m 組合數乙個乙個算但是不是很大的要預先處理好階乘 數很大需要逆元 typedef lo...

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 然而如果...

stone 組合數學 Lucas定理

傳送門解題思路 第i組的人數必須大於ci,於是我們可以將問題轉化為 n sum m ci 人分到m組中,且保證每一組的人數大於0,然後我們可以使用隔板法求出分的的組數 c m ci 我們可以直接通過基本的組合公式 費馬小定理直接求,也可以通過lucas定理求得 直接求 code includeusi...