比赛 |
AHOI09DAY2模拟 |
评测结果 |
WWWWTTTTTT |
题目名称 |
中国象棋 |
最终得分 |
0 |
用户昵称 |
苏轼 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-03-09 12:03:34 |
显示代码纯文本
#include <cstdio>
const int MAXN=105;
const int MO=9999973;
typedef unsigned long long u64;
int N,M;
int used[MAXN];
int show[MAXN][MAXN];
int s[MAXN][2],tot[MAXN];
u64 fac[MAXN][MAXN];
u64 re;
inline u64 getfac(int s,int t,int same)
{
u64 ans=1;
for(int i=s;i<=t;i++)
{
int j=i;
while(same && ((j&1)==0))same--,j/=2;
ans=ans*j%MO;
}
return ans;
}
void dfs(int dep,int now1,int now2,int same,int before)
{
re+=getfac(N-dep+1,N,same);
re%=MO;
if (dep==N)
return ;
for(int i=now1;i<M;i++)
if (used[i]<2)
{
show[dep][i]=1;
used[i]++;
if (i!=now1) dfs(dep+1,i,i+1,same,1);
else if (before<=1) dfs(dep+1,i,i+1,same+1,1);
if (i==now1 && now2<M && used[now2]<2)
{
used[now2]++;
show[dep][now2]=1;
if (before==2) dfs(dep+1,now1,now2,same+1,2);
else dfs(dep+1,now1,now2,same,2);
used[now2]--;
show[dep][now2]=0;
}
int j=(i==now1)?(now2+1):(i+1);
for(;j<M;j++)
if (used[j]<2)
{
show[dep][j]=1;
used[j]++;
dfs(dep+1,i,j,same,2);
show[dep][j]=0;
used[j]--;
}
used[i]--;
show[dep][i]=0;
}
}
int main()
{
freopen("cchess.in","r",stdin);
freopen("cchess.out","w",stdout);
scanf("%d%d",&N,&M);
fac[0][0]=1;
for(int i=0;i<N;i++)
{
fac[i+1][0]=fac[i][0]*(i+1)%MO;
if ((i+1)&1)
for(int j=0;j<i/2+1;j++)
fac[i+1][j]=fac[i][j]*(i+1)%MO;
else
for(int j=0;j<i/2+1;j++)
fac[i+1][j+1]=fac[i][j]*((i+1)/2)%MO;
}
dfs(0,0,1,0,0);
printf("%lld\n",re);
return 0;
}