记录编号 159454 评测结果 AAAAAAAAAA
题目名称 走道铺砖问题 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 1.672 s
提交时间 2015-04-21 16:06:35 内存使用 175.20 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
const int mod=100000;
class miku{
public:
	int n;
	int s[20];
	miku(){n=1;memset(s,0,sizeof(s));}
	void operator = (int x)
	{
		memset(s,0,sizeof(s));
		n=1;
		s[0]=x;
	}
	void operator += (const miku &b)
	{
		n=max(n,b.n)+1;
		for(int i=0;i<n;i++)
		{
			s[i]+=b.s[i];
			s[i+1]+=s[i]/mod;
			s[i]%=mod;
		}
		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("%05d",s[i]);
	}
};
miku dp[41][13][1<<12];
int N,M;
void DFS(int n,int p,int s1,int s2){
	if(p>M) return;
	dp[n][p][s1]+=dp[n-1][p][s2];
	DFS(n,p+1,s1<<1,(s2<<1)|1);//什么都不放
	DFS(n,p+1,(s1<<1)|1,s2<<1);//竖着放
	DFS(n,p+2,(s1<<2)|3,(s2<<2)|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++) dp[0][i][(1<<i)-1]=1;
	for(int i=1;i<=N;i++) DFS(i,0,0,0);
	dp[N][M][(1<<M)-1].print();
	return 0;
}