记录编号 386770 评测结果 AAAWWWWWWW
题目名称 长方形骨牌覆盖 最终得分 30
用户昵称 Gravatar农场主 是否通过 未通过
代码语言 C++ 运行时间 2.976 s
提交时间 2017-03-25 08:05:00 内存使用 186.58 MiB
显示代码纯文本
//1520
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int nmax=9765630;
ll f[2][nmax]={0};
int P[nmax]={0};
int R,N,M;
void PreDo(){
	scanf("%d%d%d",&R,&N,&M);
	P[0]=1;
	for(int i=1;i<=M;i++){
		P[i]=P[i-1]*R;
	}
	f[0][P[M]-1]=1;
}
void DFS(int n,int p,int s1,int s2){
	if(p>M){
		return ;
	}
	if(p==M){
		f[n][s1]+=f[n^1][s2];
		return ;
	}
	for(int i=0;i<R-1;i++){
		DFS(n,p+1,s1*R+i,s2*R+(i+1)%R);
	}
	DFS(n,p+1,s1*R+R-1,s2*R);
	DFS(n,p+R,s1*P[R],s2*P[R]);
}

void Cal(){
	if(N<M){
		swap(N,M);
	}
	for(int i=1;i<=N;i++){
		DFS(i&1,0,0,0);
		memset(f[(i&1)^1],0,sizeof(f[(i&1)^1]));
	}
	if(N%R&&M%R){
		printf("0\n");
		return ;
	}
	else{
		printf("%lld\n",f[N&1][P[M]-1]);
	}
}
int main(){
	freopen("examseven.in","r",stdin);
	freopen("examseven.out","w",stdout);
	PreDo();
	Cal();
	return 0;
}