比赛 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;
}