一年一度的聖誕節快要來到了。每年的聖誕節小e都會收到許多禮物,當然他也會送出許多禮物。不同的人物在小e
心目中的重要性不同,在小e心中分量越重的人,收到的禮物會越多。小e從商店中購買了n件禮物,打算送給m個人
,其中送給第i個人禮物數量為wi。請你幫忙計算出送禮物的方案數(兩個方案被認為是不同的,當且僅當存在某
個人在這兩種方案中收到的禮物不同)。由於方案數可能會很大,你只需要輸出模p後的結果。
輸入的第一行包含乙個正整數p,表示模;
第二行包含兩個整整數n和m,分別表示小e從商店購買的禮物數和接受禮物的人數;
以下m行每行僅包含乙個正整數wi,表示小e要送給第i個人的禮物數量。
若不存在可行方案,則輸出「impossible」,否則輸出乙個整數,表示模p後的方案數。
100
4 2 1 2
12【樣例說明】
下面是對樣例1的說明。
以「/」分割,「/」前後分別表示送給第乙個人和第二個人的禮物編號。12種方案詳情如下:
1/23 1/24 1/34
2/13 2/14 2/34
3/12 3/14 3/24
4/12 4/13 4/23
【資料規模和約定】
設p=p1^c1 * p2^c2 * p3^c3 * … *pt ^ ct,pi為質數。
對於100%的資料,1≤n≤109,1≤m≤5,1≤pi^ci≤10^5。
如果$\sum w_>n$顯然無解,如果$\sum w_
#include#include#include#include#include#include#include#include#include#include#include#define ll long longusing namespace std;
ll n,p;
int m;
ll w[10];
ll quick(ll x,ll y,ll mod)
x=x*x%mod;
y>>=1;
}return res;
}ll find(ll n,ll p,ll mod)
ll res=1ll;
for(ll i=2;i<=mod;i++)
}res=quick(res,n/mod,mod);
for(ll i=2;i<=n%mod;i++)
}return res*find(n/p,p,mod)%mod;
}ll inv(ll n,ll mod,ll p)
ll crt(ll b,ll mod,ll p)
ll c(ll n,int m,ll p,ll mod)
for(int i=1;i<=m;i++)
}return res*quick(p,k,mod)%mod;
}ll ex_lucas(ll n,int m)
res+=crt(c(n,m,i,mod),mod,i),res%=p;}}
if(sum!=1)
return res;
}int main()
if(sum<0)
w[++m]=sum;
printf("%lld",ex_lucas(n,m));
}
BZOJ 2142 禮物 組合數學 數論
題目大意 給定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...
BZOJ 1293 生日禮物
我發現bzoj的水題都比較高檔昂。這道題的基本思想是,每次用優先佇列把位置最靠前的顏色彈出來,並把與它顏色相同的下乙個點的位置進佇列,每次更新最優長度。1.初始化 每個點的下乙個相同顏色點的位置。2.將每個顏色的第乙個點入佇列,算第乙個狀態。3.每次將佇列最前端的顏色彈出,將他的下乙個點放入佇列,更...
BZOJ 2288 生日禮物
題目鏈結 演算法 先將這個序列的正負數合併起來,變成乙個正負交替的序列 如果新序列的正數個數小於等於m,那麼直接輸出正數的和即可 否則,我們可以將某些正數和負數合併起來,或者不要某些正數 將所有數按絕對值排序,放入堆中,問題就轉化為了 在這些數中選出 cnt m 個數 其中cnt為正數的個數 選了乙...