记录编号 |
410619 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[SCOI 2008] 着色方案 |
最终得分 |
100 |
用户昵称 |
FoolMike |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
3.934 s |
提交时间 |
2017-06-01 14:34:19 |
内存使用 |
48.29 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int p=1e9+7;
int x[16][16][16][16][16][6],y[16][16][16][16][16][6];
int n,k,cnt[6];
int inc(int x,int y){x+=y;return x>=p?x-p:x;}
int mul(int x,int y){return (long long)x*y%p;}
int main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
scanf("%d",&k);
for (int i=1;i<=k;i++){
int a;
scanf("%d",&a);
cnt[a]++;
n+=a;
}
x[cnt[1]][cnt[2]][cnt[3]][cnt[4]][cnt[5]][0]=1;
for (int i=n;i;i--){
memset(y,0,sizeof y);
for (int a=0;a<=k;a++)
for (int b=0;a+b<=k;b++)
for (int c=0;a+b+c<=k;c++)
for (int d=0;a+b+c+d<=k;d++)
for (int e=0;a+b+c+d+e<=k;e++)
for (int last=0;last<=5;last++){
int v=x[a][b][c][d][e][last];
if (!v) continue;
if (a) y[a-1][b][c][d][e][0]=inc(y[a-1][b][c][d][e][0],mul(v,last==1?a-1:a));
if (b) y[a+1][b-1][c][d][e][1]=inc(y[a+1][b-1][c][d][e][1],mul(v,last==2?b-1:b));
if (c) y[a][b+1][c-1][d][e][2]=inc(y[a][b+1][c-1][d][e][2],mul(v,last==3?c-1:c));
if (d) y[a][b][c+1][d-1][e][3]=inc(y[a][b][c+1][d-1][e][3],mul(v,last==4?d-1:d));
if (e) y[a][b][c][d+1][e-1][4]=inc(y[a][b][c][d+1][e-1][4],mul(v,last==5?e-1:e));
}
memcpy(x,y,sizeof x);
}
printf("%d\n",x[0][0][0][0][0][0]);
return 0;
}