#include <iostream>
#include <stdint.h>
#include <cmath>
#include <cstring>
 
using namespace std;
 
uint32_t count = 0;
bool v[100][100];
int32_t w, h, wh, w1, h1;
 
inline bool cc(int32_t x, int32_t y) {
	if (x == w1 || y == h1 || x == 0 || y == 0) return false;
 
	if (v[x][y] && v[x + 1][y] + v[x - 1][y] + v[x][y + 1] + v[x][y - 1] == 0) return true;
	return false;
}
 
inline bool cx(int32_t yy) {
	for (int32_t x = w1; x > 0; --x) {
		if (v[x][0]) return true;
	}
	for (int32_t y = yy; y != 0; --y) {
		if (v[w1][y]) return true;
	}
	return false;
}
 
inline bool cy(int32_t xx) {
	for (int32_t y = h1; y > 0; --y) {
		if (v[0][y]) return true;
	}
	for (int32_t x = xx; x != 0; --x) {
		if (v[x][h1]) return true;
	}
	return false;
}
 
inline bool cl(int32_t yy) {
	for (int32_t y = yy; y > 0; --y) {
		if (v[0][y]) return true;
	}
	return false;
}
 
inline bool cu(int32_t xx) {
	for (int32_t x = xx; x > 0; --x) {
		if (v[x][0]) return true;
	}
	return false;
}
 
inline void f(int32_t x, int32_t y, int32_t d) {
	if (x == w1 && y == h1) {
		if (d == wh) {
			count++;
			return;
		}
		return;
	}
 
	v[x][y] = false;
 
	if (x == w1 && cx(y)) {
		v[x][y] = true;
		return;
	}
 
	if (y == h1 && cy(x)) {
		v[x][y] = true;
		return;
	}
 
	if (x == 0 && cl(y)) {
		v[x][y] = true;
		return;
	}
 
	if (y == 0 && cu(x)) {
		v[x][y] = true;
		return;
	}
 
	if (cc(x + 1, y) || cc(x - 1, y) || cc(x, y + 1) || cc(x, y - 1)) {
		v[x][y] = true;
		return;
	}
 
	d++;
	if (x != w1 && v[x + 1][y]) f(x + 1, y, d);
	if (y != h1 && v[x][y + 1]) f(x, y + 1, d);
	if (x && v[x - 1][y]) f(x - 1, y, d);
	if (y && v[x][y - 1]) f(x, y - 1, d);
 
	v[x][y] = true;
}
 
int main() {
	cin >> w >> h;
	w1 = w - 1;
	h1 = h - 1;
	wh = w * h;
 
	memset(v, true, sizeof(v));
 
	if (!(!(w & 1) && !(h & 1))) {
		if (w == 1 || w == 2 || h == 1 || h == 2) {
			count = 1;
		}
		else {
			if (min(w, h) == 3) {
				count = pow(2, max(w, h) - 2);
			}
			else {
				f(0, 0, 1);
			}
		}
	}
 
	cout << count << endl;
 
	return 0;
}