一、题目链接
P10112 [GESP202312 八级] 奖品分配 - 洛谷
二、解题思路
n = 3 m = 2 a = {2, 1}
我们把每个人当成一个位置,往里面放奖品。
一共三个位置,两个相同的奖品放在位置上,有C(3, 2)种放法。
放完两个奖品,还有一个位置可放,那剩下一个奖品只有一个位置可放,所以只有C(1, 1)种放法。
根据乘法原理,我们将两次选择的方案数乘起来即为答案。
但是奖品数量可能比n大1,所以我们把原本的3个位置改成奖品数量之和,即把多余的分给空气。
三、完整代码
#include <iostream> using namespace std;const int N = 1005, MOD = 1e9 + 7;int n, m, a[N], c[N][N];void Init() { // 初始化组合数组(杨辉三角)for (int i = 0; i < N; i++) {c[i][0] = 1;for (int j = 1; j <= i; j++)c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % MOD;} }int main() {Init();int t;cin >> t;while (t--) {int sum = 0;cin >> n >> m;for (int i = 1; i <= m; i++)cin >> a[i], sum += a[i];long long ans = 1;for (int i = 1; i <= m; i++) {ans = (1ll * ans * c[sum][a[i]]) % MOD;sum -= a[i];}cout << ans << endl;}return 0; }