记录编号 410619 评测结果 AAAAAAAAAA
题目名称 [SCOI 2008] 着色方案 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 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;
}