解题思路:考虑前i中颜色的球已经涂好现在要图第i+1种球设第i+1中颜色的球的数量为N则有之前已经排好序的球的数量为m即将N-1个球插入的已经排好的m个球中既有m+1个空格可插即可,即N个球插入M个盒子有多少种插法即共有(N+(M-1))!/(N!*(M-1)!);考虑数过大求逆元即可,和cf300C题类似
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<list>
#include<vector>
#define MOD 1000000007
using namespace std;
const int maxn=10010;
long long num[maxn];
long long F[maxn<<1];
void init(){
F[0]=F[1]=1;
for(long long i=2;i<=1000;++i){
F[i]=F[i-1]*i%MOD;
}
}
long long Pow(long long a,long long b){
if(b==0)return 1%MOD;
long long t=Pow(a,b>>1);
t=t*t%MOD;
if(b&1)t=t*a%MOD;
return t;
}
//(n+m)!/(n!*m!)
int main()
{
init();
int n,i,j,k;
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d",&num[i]);
}
if(n==1){
printf("1\n");
}
else {
long long cnt=num[1],ans=1;
for(i=2;i<=n;++i){
long long b=F[cnt]*F[num[i]-1]%MOD;
ans=ans*(F[cnt+num[i]-1]*Pow(b,MOD-2)%MOD)%MOD;
cnt+=num[i];
}
printf("%lld\n",ans);
}
return 0;
}