记录编号 |
159448 |
评测结果 |
AAAAAAAAAA |
题目名称 |
走道铺砖问题 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}