題目:hdu 3037
題意:有n個樹,m個堅果,放到n個樹裡,可以不放完,有多少種方法。
分析:
得到組合數了。
大組合數什麼費馬小定理,lucas定理都來了;
總的說,不能用二維地推了,用的卻是組合數的定義。
一般來說大組合通常要取模。
那麼不能邊乘邊模,邊除邊模,等式不會成立。
根據逆元,除以乙個數取模 = 乘以這個數對mod的逆元。
那麼式子就可以寫成:
這裡,我們可以預處理所有 i 對 mod 的逆元後,累乘,這樣得到的就是階乘的逆元。
然後就是求 i 對 mod 的逆元了,什麼擴充套件歐幾里得就來了。
當然,有費馬小定理。
inv[i] = (mod-mod/i)*inv[mod%i]%mod;
整個求大組合數就是這樣出來了。
void但是這個題目n,m的範圍驚人1000000000,作為階乘,逆元,陣列開不下。init()
ll c(ll n,ll m)
lucas來了:
看結果吧:
還是有組合數,用了費馬定理:
fac[n]*inv(fac[m])%p*inv(fac[n-m])%p;
因為這裡的對p的逆元 inv已經不能用陣列表示和地推了,inv()函式,利用了費馬定理,快速冪等等,原理很複雜了,哈哈~~~,我就不證明了。
void initfac(intn) 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...