#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const ll LINF = 1e18;
const int INF = 1e9;
int n, m;
ll dp[31][1 << 5]; // dp[i][mask] = Số cách xếp thoả mãn khi xét đến hàng/cột thứ i
// với mask là trạng thái của hàng/cột thứ i (bit là 1: ô có bò, bit là 0: ô đất trống)
int getBit(int mask, int i) {
return ((mask >> i) & 1);
}
bool valid(int mask, int next_mask) {
for (int j = 0; j + 1 < m; j++) {
if (getBit(mask, j) == getBit(mask, j + 1) && getBit(next_mask, j) == getBit(next_mask, j + 1) && getBit(mask, j) == getBit(next_mask, j)) 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++) dp[i][mask] = 0;
}
for (int mask = 0; mask < (1 << m); mask++) dp[1][mask] = 1;
for (int i = 1; i < n; i++) {
for (int mask = 0; mask < (1 << m); mask++) {
if (dp[i][mask] == 0) continue;
for (int next_mask = 0; next_mask < (1 << m); next_mask++) {
if (!valid(mask, next_mask)) continue;
dp[i + 1][next_mask] += dp[i][mask];
}
}
}
ll ans = 0;
for (int mask = 0; mask < (1 << m); mask++) {
ans += dp[n][mask];
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while (tt--) {
solve();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCnR5cGVkZWYgbG9uZyBsb25nIGxsOyAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgCgpjb25zdCBsbCBMSU5GID0gMWUxODsgCmNvbnN0IGludCBJTkYgPSAxZTk7CgppbnQgbiwgbTsgCmxsIGRwWzMxXVsxIDw8IDVdOyAvLyBkcFtpXVttYXNrXSA9IFPhu5EgY8OhY2ggeOG6v3AgdGhv4bqjIG3Do24ga2hpIHjDqXQgxJHhur9uIGjDoG5nL2Phu5l0IHRo4bupIGkgCgkJCQkgICAvLyAgICAgICAgICAgICAgIHbhu5tpIG1hc2sgbMOgIHRy4bqhbmcgdGjDoWkgY+G7p2EgaMOgbmcvY+G7mXQgdGjhu6kgaSAoYml0IGzDoCAxOiDDtCBjw7MgYsOyLCBiaXQgbMOgIDA6IMO0IMSR4bqldCB0cuG7kW5nKSAKCmludCBnZXRCaXQoaW50IG1hc2ssIGludCBpKSB7CglyZXR1cm4gKChtYXNrID4+IGkpICYgMSk7IAp9Cgpib29sIHZhbGlkKGludCBtYXNrLCBpbnQgbmV4dF9tYXNrKSB7Cglmb3IgKGludCBqID0gMDsgaiArIDEgPCBtOyBqKyspIHsKCQlpZiAoZ2V0Qml0KG1hc2ssIGopID09IGdldEJpdChtYXNrLCBqICsgMSkgJiYgZ2V0Qml0KG5leHRfbWFzaywgaikgPT0gZ2V0Qml0KG5leHRfbWFzaywgaiArIDEpICYmIGdldEJpdChtYXNrLCBqKSA9PSBnZXRCaXQobmV4dF9tYXNrLCBqKSkgcmV0dXJuIGZhbHNlOyAKCX0KCXJldHVybiB0cnVlOyAKfQoKdm9pZCBzb2x2ZSgpIHsKCWNpbiA+PiBuID4+IG07ICAKCWlmIChuIDwgbSkgc3dhcChuLCBtKTsgCgoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBtKTsgbWFzaysrKSBkcFtpXVttYXNrXSA9IDA7IAoJfQoJCglmb3IgKGludCBtYXNrID0gMDsgbWFzayA8ICgxIDw8IG0pOyBtYXNrKyspIGRwWzFdW21hc2tdID0gMTsgICAKCglmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewoJCWZvciAoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgbSk7IG1hc2srKykgewoJCQlpZiAoZHBbaV1bbWFza10gPT0gMCkgY29udGludWU7IAoJCQlmb3IgKGludCBuZXh0X21hc2sgPSAwOyBuZXh0X21hc2sgPCAoMSA8PCBtKTsgbmV4dF9tYXNrKyspIHsKCQkJCWlmICghdmFsaWQobWFzaywgbmV4dF9tYXNrKSkgY29udGludWU7ICAKCQkJCWRwW2kgKyAxXVtuZXh0X21hc2tdICs9IGRwW2ldW21hc2tdOyAKCQkJfQoJCX0KCX0JCQoKCWxsIGFucyA9IDA7IAoJZm9yIChpbnQgbWFzayA9IDA7IG1hc2sgPCAoMSA8PCBtKTsgbWFzaysrKSB7CgkJYW5zICs9IGRwW25dW21hc2tdOyAKCX0gCgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0KCnNpZ25lZCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAoJaW50IHR0OyAKCWNpbiA+PiB0dDsgCgl3aGlsZSAodHQtLSkgewoJCXNvbHZlKCk7IAoJfQp9Cg==