題目大意:給定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 為了便於解決,我們可以把這個問...