能想到思路,全是讨论版的启发,讨论版就给出思路了,但是我只看懂了一半。后来在纸上画了画,想出了解法,就是讨论版的思路。。。
思路:“对于所有颜色为i 的球,他的最后一个球总是在编号比他大的球拿完之前拿完”这就说明1、2、3、、、n每种颜色都有球的位置是固定的,既然这样,就好说了,比如说现在1,2种球,每种球有三个,则球1的排列是1、1、1,最后肯定有一个球2,就再最后放一个2,即1,1,1,2,然后剩下两个2,就在前边那几个空随便插进去就好了。三种球,每种三个的情况就是刚才的那个情况排好后,对于每种情况,最后边加一个3,剩下两个3在前边那些空里随便插进去。。。。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1005;
const LL mod = 1e9+7;
int c[MAXN];
LL C[MAXN][MAXN];
void init()
{
int i,j;
C[0][0] = 1;
for(int i = 1; i <= 1000; ++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 main()
{
int k;
init();
scanf("%d",&k);
for(int i = 0; i < k; ++i)
scanf("%d",&c[i]);
LL ept = 0;
LL res = 1;
for(int i = 0; i < k; ++i)
{
res = (res*C[ept+c[i]-1][c[i]-1])%mod;
ept = ept+c[i];
}
printf("%I64d\n",res);
return 0;
}