Mondriaan's Dream
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 15962   Accepted: 9237

Description

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and rectangles), he dreamt of filling a large rectangle with small rectangles of width 2 and height 1 in varying ways. 

Expert as he was in this material, he saw at a glance that he'll need a computer to calculate the number of ways to fill the large rectangle whose dimensions were integer values, as well. Help him, so that his dream won't turn into a nightmare!

Input

The input contains several test cases. Each test case is made up of two integer numbers: the height h and the width w of the large rectangle. Input is terminated by h=w=0. Otherwise, 1<=h,w<=11.

Output

For each test case, output the number of different ways the given rectangle can be filled with small rectangles of size 2 times 1. Assume the given large rectangle is oriented, i.e. count symmetrical tilings multiple times.

Sample Input

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0

Sample Output

1
0
1
2
3
5
144
51205
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long dp[13][1<<11];
int n,m;
 
void dfs(int i,int j,int state,int next)
{
    if(j==m)
    {
        dp[i+1][next] += dp[i][state];
        return;
    }
    if(((1<<j)&state) > 0)
        dfs(i,j+1,state,next);
    if(((1<<j)&state) == 0)
        dfs(i,j+1,state,next|(1<<j));
    if(j<=m-2 && ((1<<j)&state) == 0 && ((1<<(j+1))&state) == 0)
        dfs(i,j+2,state,next);
    return;
}
 
int main()
{
    while(scanf("%d%d",&n,&m)&&(n||m))
    {
        if(n%2==1&&m%2==1){
            printf("0\n");
            continue;
        }
        if(n<m) swap(n,m);
        memset(dp,0,sizeof(dp));
        dp[1][0] = 1;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<(1<<m);j++)
            {
                if(dp[i][j])
                    dfs(i,0,j,0);
            }
        }
        printf("%lld\n",dp[n+1][0]);
    }
}

最新文章

  1. APP测试入门篇之APP基础知识(001)
  2. A Simple OpenGL Shader Example II
  3. null 和 undefined 的区别
  4. Java开发常用Linux命令
  5. html5 视频播放
  6. 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
  7. OpenGL 和OpenGL ES简介
  8. 自定义ListView android
  9. 环形链表得golang实现
  10. qt 串口
  11. Mesh内存分配器的mmap小技巧
  12. typescript里面调用javasript
  13. VIM 的帮助文档在哪里?看这里。
  14. Lattice Constants and Crystal Structures of some Semiconductors
  15. C++代码文件名标准化处理工具
  16. spring security+cas(cas proxy配置)
  17. for 续6
  18. Django 中form的用法
  19. angular指令中的scope绑定策略
  20. CentOS7 firewalld打开关闭防火墙 开放端口

热门文章

  1. JMeter Exception: java.net.BindException: Address already in use: connect(转)
  2. freemarker数值格式化
  3. Mac上通过iterm 上传文件到服务器
  4. 把composer的源切换为 国际的源
  5. 【转帖】理解 Linux 的虚拟内存
  6. [转帖]浏览器的F5和Ctrl+F5
  7. 腾讯机试题 AcWing 603 打怪兽
  8. Java 8 函数式接口
  9. vue &amp; iview
  10. Servlet的cookie使用,500报错,tomcat和cookie语法不兼容解决