BZOJ 2142 禮物 組合數學 數論

2021-06-26 04:33:26 字數 1147 閱讀 2728

題目大意:給定n個物品,分給m個人,每個人拿到wi個禮物,問方案數mod pp不一定為質數

首先我們把剩下的禮物也分給乙個人 答案明顯不變 w[++m]=n-w1-w2-...-wm

然後就會很方便地得到公式:

ans=c(n,w1)*c(n-w1,w2)*c(n-w1-w2,w3)*...*c(n-w1-w2-...-w_(m-1),wm) mod p

=n!/w1!/w2!/.../wm! mod p

然後p不是質數 我們把p分解 令p=∏pi^ai

我們分別處理,可以得到一次同餘方程組ans%pi^ai=lefti,用中國剩餘定理合併一下即可。

然後對於每個pi^ai,我們進行以下處理:

將分子和分母化為x*pi^y的形式

然後分母的x部分與pi互質,可以求逆元,分子分母的y部分直接相減即可

然後我們處理階乘

以19為例,將19!化為x*pi^y的形式,其中pi=3,ai=2 則有

19!%9=(1*2*3*4*5*6*7*8*9*10*11*12*13*14*15*16*17*18*19) %9

=(1*2*4*5*7*8*10*11*13*14*16*17*19)*3^6*(1*2*3*4*5*6) %9

式子的左半部分是不為3的倍數的數,存在長度為p^a的迴圈節 求出乙個迴圈節 快速冪處理 然後處理剩餘部分

右半部分是6!%9 遞迴處理即可

我這題解寫的真是冷靜。。。這題還真tm讓人冷靜不下來啊-0-

#include#include#include#includeusing namespace std;

typedef long long ll;

typedef pairabcd;

ll p,n,m,a[20],ans;

struct prime_factorprime[50];int tot;

void decomposition(ll x)

if(x!=1)

prime[++tot].p=x,prime[tot].a=1,prime[tot].p_a=x;

}ll quick_power(ll x,ll y,ll mo)

return re;

}abcd deal(ll x,int pos)

if(sum

BZOJ2142禮物 擴充套件盧卡斯

一年一度的聖誕節快要來到了。每年的聖誕節小e都會收到許多禮物,當然他也會送出許多禮物。不同的人物在小e 心目中的重要性不同,在小e心中分量越重的人,收到的禮物會越多。小e從商店中購買了n件禮物,打算送給m個人 其中送給第i個人禮物數量為wi。請你幫忙計算出送禮物的方案數 兩個方案被認為是不同的,當且...

Newcoder 128 A 禮物(組合數學)

description 假設某個店鋪有n nn種不同型別的1 11元奧利奧和m mm種不同型別的2 22元奧利奧,而且餘量無限,我的錢有k kk元,我想把k kk元都用來買奧利奧,且可以買同型別的奧利奧,你能幫我算出有多少種購買方式嗎?設答案為z zz,這個數字也許會很大,所以我們只需要輸出zmo ...

組合數學 卡特蘭數

我們以一道題為例來介紹卡特蘭數 給定n n 個0 0 和n n個1 1,它們將按照某種順序排成長度為2 n 2n的序列,求它們能排列成的所有序列中,能夠滿足任意字首序列中0 0的個數都不少於1 1的個數的序列有多少個。輸出的答案對109 7 109 7取模。109 7 為了便於解決,我們可以把這個問...