记录编号 159448 评测结果 AAAAAAAAAA
题目名称 走道铺砖问题 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.660 s
提交时间 2015-04-21 15:36:16 内存使用 175.20 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
const int BASE=10000;
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(void){
		printf("%d",s[n-1]);
		for(int i=n-2;i>=0;i--) printf("%04d",s[i]);
	}
};
HPint f[41][13][1<<12];
int N,M;
void DFS(int n,int p,int s1,int s2){
	if(p>M) return;
	f[n][p][s1]+=f[n-1][p][s2];
	DFS(n,p+1,s1*2,s2*2+1);//什么都不放
	DFS(n,p+1,s1*2+1,s2*2);//竖着放
	DFS(n,p+2,s1*4+3,s2*4+3);
}
int main(){
	freopen("floor.in","r",stdin);
	freopen("floor.out","w",stdout);
	cin>>N>>M;
	if(M>N) swap(M,N);
	for(int i=1;i<=M;i++) f[0][i][(1<<i)-1]=1;
	for(int i=1;i<=N;i++) DFS(i,0,0,0);
	f[N][M][(1<<M)-1].print();
	return 0;
}