Descripiton:
nn个特产,每种个,每个人都得分到,求方案数。
Solution:
最近刷水成性。
直接通过隔板法计算没办法保证非空,考虑容斥原理弱化。枚举至少几个空的,再分别计算每种特产如何分,最后乘法原理乘起来即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2005, P = 1e9 + 7;
int n, m;
ll ans;
int a[N];
ll c[N][N];
int main() {
scanf("%d%d", &n, &m);
c[0][0] = 1;
for(int i = 1; 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]) % P;
}
}
for(int i = 1; i <= m; ++i) {
scanf("%d", &a[i]);
}
for(int i = 0; i < n; ++i) {
ll t = c[n][i];
for(int j = 1; j <= m; ++j) {
t = t * c[a[j] + n - i - 1][n - i - 1] % P;
}
ans = (ans + t * ((i & 1) ? -1 : 1) + P) % P;
}
printf("%lld\n", ans);
return 0;
}