记录编号 159478 评测结果 AAAAAAAAAA
题目名称 走道铺砖问题 最终得分 100
用户昵称 GravatarDijkstra 是否通过 通过
代码语言 C++ 运行时间 0.173 s
提交时间 2015-04-21 17:17:30 内存使用 13.76 MiB
显示代码纯文本
#include<cmath>
#include<fstream>
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 41
#define INF ((1<<M)-1)
#define LL long long
#define BASE 10000
using namespace std;
class HPint{
public:
	int n;
	int s[20];
	HPint(){n=1;memset(s,0,sizeof(s));}
	void operator = (int x){
		memset(s,0,sizeof(s));
		n=1;
		s[0]=x;
	}
	void operator += (const HPint &b){
		n=max(n,b.n)+1;
		for(int i=0;i<n;i++){
			s[i]+=b.s[i];
			s[i+1]+=s[i]/BASE;
			s[i]%=BASE;
		}
		while(n>1&&s[n-1]==0) n--;
	}
	void print(){
		printf("%d",s[n-1]);
		for(int i=n-2;i>=0;i--) printf("%04d",s[i]);
	}
};
int N,M;
HPint F[MAXN][1<<12];
void DFS(int x,HPint s,int p,int k)
{
	F[p+1][x]+=s;
	for(int i=k;i<M;i++) 
		if((!((x>>(M-i))&1))&&(!((x>>(M-i-1))&1))) 
			DFS(x+(1<<(M-i))+(1<<(M-i-1)),s,p,i+2);
}
int main()
{
	freopen("floor.in","r",stdin);
    freopen("floor.out","w",stdout);
	cin>>N>>M;
	if(N<M) swap(N,M);
	for(int i=0;i<=N;i++) for(int j=0;j<=INF;j++) F[i][j]=0;
	F[0][INF]=1;
	for(int i=0;i<N;i++)
	{
		for(int j=0;j<=INF;j++)
		{
			int x=(~j)&INF;
			DFS(x,F[i][j],i,1);
		}
	}
	F[N][INF].print();
	return 0;
}