记录编号 23371 评测结果 AAAAAAAAAA
题目名称 [AHOI2009] 中国象棋 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.509 s
提交时间 2011-03-09 15:21:43 内存使用 9.08 MiB
显示代码纯文本
#include <cstdio>

typedef long long s64;

const int MAXN=105;
const int MO=9999973;

s64 d[MAXN][MAXN][MAXN];
int N,M;

inline void Add(s64 &a,const s64 b)
{
	a=(a+b)%MO;
}

int main()
{
	freopen("cchess.in","r",stdin);
	freopen("cchess.out","w",stdout);
	scanf("%d%d",&N,&M);
	d[0][0][0]=1;
	for(int i=0;i<N;i++)
		for(int j=0;j<=M;j++)
			for(int k=0;k+j<=M;k++)
				if (d[i][j][k])
				{
					const s64 &now=d[i][j][k];
					Add(d[i+1][j][k],now);//-1 -1
					if (k+j+1<=M)
						Add(d[i+1][j+1][k],now*(M-j-k));//0 -1
					if (j>=1)
						Add(d[i+1][j-1][k+1],now*j);//1 -1
					if (k+j+2<=M)
						Add(d[i+1][j+2][k],now*(M-j-k)*(M-j-k-1)/2);//0 0
					if (j>=2)
						Add(d[i+1][j-2][k+2],now*j*(j-1)/2);//1 1
					if (k+j+1<=M)
						Add(d[i+1][j][k+1],now*j*(M-j-k));//0 1
				}
	s64 re=0;
	for(int j=0;j<=M;j++)
		for(int k=0;k+j<=M;k++)
			Add(re,d[N][j][k]);
	printf("%lld\n",re);
	return 0;
}