选取m件物品分给n个人即C(m+n-1)(n-1)
C(n)(m)=C(n-1)(m-1)+C(n-1)(m)
代码如下:
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<string> #include<algorithm> using namespace std; const int maxn=1000; const long long int mod=1000000007; long long int a[maxn],c[maxn][maxn]; int main() { int n,m; while(~scanf("%d %d",&n,&m)) { memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); for(int i=1;i<=m;i++) { scanf("%d",&a[i]); } c[1][0]=c[1][1]=1; for(int i=2;i<=maxn;i++) { c[i][0]=1; for(int j=1;j<=i;j++) { c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod; } } int f=1; long long int now; long long int ans=0; for(int i=0;i<=n;i++) { now=c[n][i]; for(int j=1;j<=m;j++) { now=(now*c[a[j]+n-1-i][n-1-i])%mod; } ans=(ans+f*now)%mod; f*=-1; } printf("%lld\n",(ans+mod)%mod); } }