當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
[JSOI 2011]分特产
生活随笔
收集整理的這篇文章主要介紹了
[JSOI 2011]分特产
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Description
JYY 帶隊(duì)參加了若干場(chǎng)ACM/ICPC 比賽,帶回了許多土特產(chǎn),要分給實(shí)驗(yàn)室的同學(xué)們。 JYY 想知道,把這些特產(chǎn)分給N 個(gè)同學(xué),一共有多少種不同的分法?當(dāng)然,JYY 不希望任何一個(gè)同學(xué)因?yàn)闆]有拿到特產(chǎn)而感到失落,所以每個(gè)同學(xué)都必須至少分得一個(gè)特產(chǎn)。 例如,JYY 帶來了2 袋麻花和1 袋包子,分給A 和B 兩位同學(xué),那么共有4 種不同的分配方法: A:麻花,B:麻花、包子 A:麻花、麻花,B:包子 A:包子,B:麻花、麻花 A:麻花、包子,B:麻花Input
輸入數(shù)據(jù)第一行是同學(xué)的數(shù)量N 和特產(chǎn)的數(shù)量M。 第二行包含M 個(gè)整數(shù),表示每一種特產(chǎn)的數(shù)量。 N, M 不超過1000,每一種特產(chǎn)的數(shù)量不超過1000Output
輸出一行,不同分配方案的總數(shù)。由于輸出結(jié)果可能非常巨大,你只需要輸出最終結(jié)果MOD 1,000,000,007 的數(shù)值就可以了。Sample Input
5 41 3 3 5
Sample Output
384835
題解
想到了隔板法,想到了容斥...就是不知道怎么寫...
對(duì)于總共$n$個(gè)人,很容易想到第$i$個(gè)物品,分出的方案數(shù)為$C^{n-1} _{a[i]+n-1}$,其中$a[i]$為個(gè)數(shù)(隔板法)。
但是這樣做就會(huì)導(dǎo)致有人分不到特產(chǎn)。
考慮容斥,我們-一個(gè)人分不到的情況+兩個(gè)人分不到的情況-三個(gè)人...
我們直接限定隔板的數(shù)目來強(qiáng)制一些人分不到特產(chǎn),即方案數(shù)變?yōu)?C^{n-1-i} _{a[j]+n-1-i}$,其中$i$個(gè)人強(qiáng)制分不到,第$j$個(gè)物品。
注意最后,因?yàn)榉植坏降娜丝梢允侨我獾?#xff0c;所以每次容斥還要*$C^i _n$。
1 //It is made by Awson on 2017.9.25 2 #include <set> 3 #include <map> 4 #include <cmath> 5 #include <ctime> 6 #include <queue> 7 #include <stack> 8 #include <string> 9 #include <cstdio> 10 #include <vector> 11 #include <cstdlib> 12 #include <cstring> 13 #include <iostream> 14 #include <algorithm> 15 #define Min(a, b) ((a) < (b) ? (a) : (b)) 16 #define Max(a, b) ((a) > (b) ? (a) : (b)) 17 #define LL long long 18 using namespace std; 19 const int N = 1000; 20 const int MOD = 1000000007; 21 22 int n, m, mx; 23 int a[N+5]; 24 int C[N*2+5][N*2+5]; 25 26 void work() { 27 scanf("%d%d", &n, &m); 28 for (int i = 1; i <= m; i++) { 29 scanf("%d", &a[i]); 30 mx = Max(mx, a[i]); 31 } 32 mx += n; 33 for (int i = 0; i <= mx; i++) { 34 C[i][0] = 1; 35 for (int j = 1; j <= i; j++) 36 C[i][j] = (C[i-1][j-1]+C[i-1][j])%MOD; 37 } 38 LL ans = 0; 39 for (int i = 0; i < n; i++) { 40 LL cnt = 1; 41 for (int j = 1; j <= m; j++) 42 cnt = cnt*C[a[j]+n-1-i][n-1-i]%MOD; 43 cnt = cnt*C[n][i]%MOD; 44 if (i%2) ans = (ans+MOD-cnt)%MOD; 45 else ans = (ans+cnt)%MOD; 46 } 47 printf("%lld\n", ans); 48 } 49 int main() { 50 work(); 51 return 0; 52 }?
轉(zhuǎn)載于:https://www.cnblogs.com/NaVi-Awson/p/7594023.html
總結(jié)
以上是生活随笔為你收集整理的[JSOI 2011]分特产的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发人员的判断
- 下一篇: js实现星级评分效果(非常规5个li代码