安吉D4-G
810 字
4 分钟
安吉D4-G
- 1安吉D19 T1
- 2安吉D19 T3
- 3安吉D20 模考12总结
- 4安吉D17 T3
- 5安吉D17 T4
- 6安吉D19 模考11总结
- 7安吉D15 A
- 8安吉D16 T4
- 9安吉D17 T1
- 10安吉D17 模考10总结
- 11安吉D16 T3
- 12安吉D16 模考9总结
- 13安吉D13 模考8总结
- 14安吉D13-T2
- 15安吉D13-T3
- 16安吉D12-T3
- 17安吉D11-B
- 18安吉D11-C
- 19安吉D11-D
- 20安吉D12 模考7总结
- 21安吉D12-T2
- 22安吉D11-A
- 23安吉D10 模考6总结
- 24安吉D10-T3
- 25安吉D10-T4
- 26安吉D8-E
- 27安吉D9-T4
- 28安吉D8-A
- 29安吉D8-B
- 30安吉D8-C
- 31安吉D8-D
- 32安吉D9 模考5总结
- 33安吉D9-T2
- 34安吉D9-T3
- 35安吉D6-T4
- 36安吉D4-G本文
- 37安吉D5-T2
- 38安吉D6 模考4总结
- 39安吉D6-T1
- 40安吉D6-T3
- 41安吉-开营测试 T4
- 42安吉D5 模考3总结
- 43安吉D5-T3
- 44安吉D4-A
- 45安吉D4-B
- 46安吉D4-C
- 47安吉D4:容斥原理
- 48安吉Day4-D
- 49安吉D3 模考2总结
- 50安吉D3-T1
- 51安吉D3-T2
- 52安吉D3-T4
- 53安吉D2 模考1总结
- 54安吉D2-T2
- 55安吉D1-G
- 56安吉D1-L
- 57安吉D2-T4
原题呈现
P5505 分特产
题目描述
JYY 带队参加了若干场 比赛,带回了许多土特产,要分给实验室的同学们.
JYY 想知道,把这些特产分给 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产.
例如,JYY 带来了 袋麻花和 袋包子,分给 和 两位同学,那么共有 种不同的 分配方法:
:麻花, :麻花、包子
:麻花、麻花, :包子
:包子, :麻花、麻花
:麻花、包子, :麻花
输入格式
输入数据:
第一行是同学的数量 和特产的种类 .
第二行包含 个整数,表示每一种特产的数量.
不超过 ,每一种特产的数量不超过 .
输出格式
输出一行,不同分配方案的总数.
由于输出结果可能非常巨大,你只需要输出最终结果 的数值就可以了.
输入输出样例 #1
输入 #1
5 41 3 3 5输出 #1
384835正难则反,我们先抛弃“所以每个同学都必须至少分得一个特产”这一个条件,对于每一种特产,我们需要求将 个特产分给 位同学的方案数,这等同于将 个没标号的小球放在 个标号的盒子里,允许空盒.共有 种可能.由于对于每一种特产都有上述方案,因此总方案数 为:
接下来处理空盒的情况.
我们使用容斥,答案为 减去钦定任意一个盒子为空的方案数,加上钦定任意两个盒子为空的方案数,减去钦定任意三个盒子为空的方案数,直到所有盒子都为空的方案数.
存在 个盒子为空的方案数 ,可以想象成去掉这 个盒子,其他盒子可以为空,也可以不为空,可以使用上面计算 的方法,因此对于每一种钦定方案所对应的方案数 ,有:
由于钦定了 个盒子为空,这又有 种钦定方法,所以有:
显然,各个约束地位相等,因此根据容斥公式,可以算出答案 ,公式如下:
标程
#include <bits/stdc++.h>using namespace std;#define int long longconst int N = 2005;const int MOD = 1e9 + 7;int n, m, a[N], C[N][N];int ans;int calC(int x, int y) { if (x == y || y == 0) return 1; if (C[x][y] == 0) { C[x][y] = (calC(x - 1, y) + calC(x - 1, y - 1)) % MOD; } return C[x][y];}signed main() { cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { int tot = 1; for (int j = 1; j <= m; j++) { (tot *= calC(n + a[j] - i - 1, n - i - 1)) %= MOD; } int coe = calC(n, i); if (i % 2 == 1) coe = (MOD - coe) % MOD; // (-1)^i ans = (ans + coe * tot) % MOD; } cout << ans % MOD;}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!


