记录编号 |
23371 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[AHOI2009] 中国象棋 |
最终得分 |
100 |
用户昵称 |
苏轼 |
是否通过 |
通过 |
代码语言 |
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;
}