#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const ll LINF = 1e18;
const int INF = 1e9;
// Ta có n * m <= 30
// => min(n, m) <= sqrt(30) ~ 5
// Do đó, ta luôn chọn chiều nhỏ hơn để làm trạng thái DP nhằm tối ưu độ phức tạp
int n, m;
ll dp[31][1 << 5]; // dp[i][mask] = Số cách xếp bò thoả mãn khi xét i hàng/cột đầu tiên
// với mask biểu diễn trạng thái của hàng/cột thứ i
// (0: ô đất trống, 1: ô có bò)
int getBit(int mask, int i) {
return ((mask >> i) & 1);
}
bool valid(int prev_mask, int mask) {
for (int j = 0; j + 1 < m; j++) {
int a = getBit(prev_mask, j);
int b = getBit(prev_mask, j + 1);
int c = getBit(mask, j);
int d = getBit(mask, j + 1);
if (a == b && b == c && c == d) return false;
}
return true;
}
void solve() {
cin >> n >> m;
if (n < m) swap(n, m);
for (int i = 1; i <= n; i++) {
for (int mask = 0; mask < (1 << m); mask++) {
if (i == 1) {
dp[i][mask] = 1;
continue;
}
dp[i][mask] = 0;
for (int prev_mask = 0; prev_mask < (1 << m); prev_mask++) {
if (!valid(prev_mask, mask)) continue;
dp[i][mask] += dp[i - 1][prev_mask];
}
}
} // O(n * 2^2m * m)
ll ans = 0;
for (int mask = 0; mask < (1 << m); mask++) {
ans += dp[n][mask];
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while (tt--) {
solve();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCnR5cGVkZWYgbG9uZyBsb25nIGxsOyAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgCgpjb25zdCBsbCBMSU5GID0gMWUxODsgCmNvbnN0IGludCBJTkYgPSAxZTk7CgovLyBUYSBjw7MgbiAqIG0gPD0gMzAgCi8vID0+IG1pbihuLCBtKSA8PSBzcXJ0KDMwKSB+IDUKLy8gRG8gxJHDsywgdGEgbHXDtG4gY2jhu41uIGNoaeG7gXUgbmjhu48gaMahbiDEkeG7gyBsw6BtIHRy4bqhbmcgdGjDoWkgRFAgbmjhurFtIHThu5FpIMawdSDEkeG7mSBwaOG7qWMgdOG6oXAgCmludCBuLCBtOyAKbGwgZHBbMzFdWzEgPDwgNV07IC8vIGRwW2ldW21hc2tdID0gU+G7kSBjw6FjaCB44bq/cCBiw7IgdGhv4bqjIG3Do24ga2hpIHjDqXQgaSBow6BuZy9j4buZdCDEkeG6p3UgdGnDqm4gCgkJCQkgICAvLyAgICAgICAgICAgICAgIHbhu5tpIG1hc2sgYmnhu4N1IGRp4buFbiB0cuG6oW5nIHRow6FpIGPhu6dhIGjDoG5nL2Phu5l0IHRo4bupIGkgCgkJCQkgICAvLyAgICAgICAgICAgICAgICgwOiDDtCDEkeG6pXQgdHLhu5FuZywgMTogw7QgY8OzIGLDsikgCgppbnQgZ2V0Qml0KGludCBtYXNrLCBpbnQgaSkgewoJcmV0dXJuICgobWFzayA+PiBpKSAmIDEpOyAKfQoKYm9vbCB2YWxpZChpbnQgcHJldl9tYXNrLCBpbnQgbWFzaykgewoJZm9yIChpbnQgaiA9IDA7IGogKyAxIDwgbTsgaisrKSB7CgkJaW50IGEgPSBnZXRCaXQocHJldl9tYXNrLCBqKTsgCgkJaW50IGIgPSBnZXRCaXQocHJldl9tYXNrLCBqICsgMSk7IAoJCWludCBjID0gZ2V0Qml0KG1hc2ssIGopOyAKCQlpbnQgZCA9IGdldEJpdChtYXNrLCBqICsgMSk7IAoJCWlmIChhID09IGIgJiYgYiA9PSBjICYmIGMgPT0gZCkgcmV0dXJuIGZhbHNlOyAKCX0KCXJldHVybiB0cnVlOyAKfQoKdm9pZCBzb2x2ZSgpIHsKCWNpbiA+PiBuID4+IG07ICAKCWlmIChuIDwgbSkgc3dhcChuLCBtKTsgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBtKTsgbWFzaysrKSB7CgkJCWlmIChpID09IDEpIHsKCQkJCWRwW2ldW21hc2tdID0gMTsgIAoJCQkJY29udGludWU7IAoJCQl9CgkJCWRwW2ldW21hc2tdID0gMDsgIAoJCQlmb3IgKGludCBwcmV2X21hc2sgPSAwOyBwcmV2X21hc2sgPCAoMSA8PCBtKTsgcHJldl9tYXNrKyspIHsKCQkJCWlmICghdmFsaWQocHJldl9tYXNrLCBtYXNrKSkgY29udGludWU7ICAKCQkJCWRwW2ldW21hc2tdICs9IGRwW2kgLSAxXVtwcmV2X21hc2tdOyAKCQkJfQoJCX0KCX0gLy8gTyhuICogMl4ybSAqIG0pCQoKCWxsIGFucyA9IDA7IAoJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBtKTsgbWFzaysrKSB7CgkJYW5zICs9IGRwW25dW21hc2tdOyAKCX0gCgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0KCmludCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAoJaW50IHR0OyAKCWNpbiA+PiB0dDsgCgl3aGlsZSAodHQtLSkgewoJCXNvbHZlKCk7IAoJfQp9Cg==