首先不考虑要每个人都分到特产。这样对于一种数量为
k
的特产,就相当于把一个数
首先,把问题看作把一个数
(以下
Ai
为第
i
种特产的数量)
所以不一定要每个人都分到特产的方案数为
考虑每个人都要分到特产,就可以使用容斥原理,即:
都分到特产的方案数
−
有
所以结果为
∑ni=0(−1)iCin∏mj=1Cn−i−1Ai+n−i−1
。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {
int res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
return bo ? ~res + 1 : res;
}
const int MaxN = 2000, N = MaxN + 5, PYZ = 1e9 + 7;
int n, m, a[N], C[N][N];
void init() {
int i, j; for (i = 0; i <= MaxN; i++) C[i][0] = 1;
for (i = 1; i <= MaxN; i++) for (j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % PYZ;
}
int sum_cnt(int n) {
int i, ans = 1;
for (i = 1; i <= m; i++) ans = 1ll * ans * C[a[i] + n - 1][n - 1] % PYZ;
return ans;
}
int main() {
int i, ans = 0; n = read(); m = read(); init();
for (i = 1; i <= m; i++) a[i] = read();
for (i = 0; i <= n; i += 2)
(ans += 1ll * C[n][i] * sum_cnt(n - i) % PYZ) %= PYZ;
for (i = 1; i <= n; i += 2)
ans = (ans - 1ll * C[n][i] * sum_cnt(n - i) % PYZ + PYZ) % PYZ;
cout << ans << endl;
return 0;
}