BZOJ2142禮物 擴充套件盧卡斯

2022-05-08 03:15:11 字數 1607 閱讀 1504

一年一度的聖誕節快要來到了。每年的聖誕節小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 long

using 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為正數的個數 選了乙...