1. 程式人生 > >【BZOJ2142】禮物(擴充套件Lucas)

【BZOJ2142】禮物(擴充套件Lucas)

Description

一年一度的聖誕節快要來到了。每年的聖誕節小E都會收到許多禮物,當然他也會送出許多禮物。不同的人物在小E心目中的重要性不同,在小E心中分量越重的人,收到的禮物會越多。小E從商店中購買了n件禮物,打算送給m個人,其中送給第i個人禮物數量為wi。請你幫忙計算出送禮物的方案數(兩個方案被認為是不同的,當且僅當存在某個人在這兩種方案中收到的禮物不同)。由於方案數可能會很大,你只需要輸出模P後的結果。

Solution

參考部落格

容易看出答案是:

Ans=(nw1)(nw1w2)(nw1w2w3)

p沒有保證是質數,所以考慮對於每一個組合數用擴充套件Lucas定理求出。

p表示成ipiki,我們可以對於所有不同的質因子pi求出(nm)modpiki,然後用CRT合併,所以現在主要是要求(nm)modpiki

我們首先只考慮對於n!的計算,m!(nm)!同理。
像網上大多數部落格一樣,舉這個例子:
假設n=22pi=3ki=2
那麼n!=1×2××22
然後將其中是3的倍數的數提出來:

(1×2×4×5×7×8×10×11×13×14×16×17×19×20×22)×36×(1×2×3×4×5×6×7)
然後發現這個式子可以分成三部分:
1、piki,這個可以直接快速冪
2、對於階乘,我們可以遞迴求解
3、對於前面的缺了3的倍數的階乘,我們發現以piki為週期,它們是同餘的!
(1×2×4×5×7×8)(10×11×13×14×16×17)(mod32)
注意piki要放在最後算,因為
m!
(nm)!如果包含