#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
const int MAXN = 2e6 + 5;
long long fact[MAXN], fib[MAXN], inv_pow2[MAXN];
long long modexp(long long a, long long e) {
long long r = 1;
while (e) {
if (e & 1) r = r * a % MOD;
a = a * a % MOD;
e >>= 1;
}
return r;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
// factorial
fact[0] = 1;
for (int i = 1; i < MAXN; i++)
fact[i] = fact[i - 1] * i % MOD;
// fibonacci
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i < MAXN; i++)
fib[i] = (fib[i - 1] + fib[i - 2]) % MOD;
// inverse powers of 2
long long inv2 = modexp(2, MOD - 2);
inv_pow2[0] = 1;
for (int i = 1; i < MAXN; i++)
inv_pow2[i] = inv_pow2[i - 1] * inv2 % MOD;
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int m = 2 * n;
vector<int> a(m);
for (int i = 0; i < m; i++) cin >> a[i];
// check condition a[i] + a[i+1] == 2
bool ok = true;
for (int i = 0; i < m; i++) {
if (a[i] + a[(i + 1) % m] != 2) {
ok = false;
break;
}
}
if (!ok) {
cout << 0 << '\n';
continue;
}
// check if all ones
bool all_one = true;
for (int i = 0; i < m; i++) {
if (a[i] != 1) {
all_one = false;
break;
}
}
long long res = fact[m] * inv_pow2[n] % MOD;
if (all_one) {
res = res * fib[n + 1] % MOD;
}
cout << res << '\n';
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgaW50IE1BWE4gPSAyZTYgKyA1OwoKbG9uZyBsb25nIGZhY3RbTUFYTl0sIGZpYltNQVhOXSwgaW52X3BvdzJbTUFYTl07Cgpsb25nIGxvbmcgbW9kZXhwKGxvbmcgbG9uZyBhLCBsb25nIGxvbmcgZSkgewogICAgbG9uZyBsb25nIHIgPSAxOwogICAgd2hpbGUgKGUpIHsKICAgICAgICBpZiAoZSAmIDEpIHIgPSByICogYSAlIE1PRDsKICAgICAgICBhID0gYSAqIGEgJSBNT0Q7CiAgICAgICAgZSA+Pj0gMTsKICAgIH0KICAgIHJldHVybiByOwp9CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CgogICAgLy8gZmFjdG9yaWFsCiAgICBmYWN0WzBdID0gMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgTUFYTjsgaSsrKQogICAgICAgIGZhY3RbaV0gPSBmYWN0W2kgLSAxXSAqIGkgJSBNT0Q7CgogICAgLy8gZmlib25hY2NpCiAgICBmaWJbMF0gPSAwOwogICAgZmliWzFdID0gMTsKICAgIGZvciAoaW50IGkgPSAyOyBpIDwgTUFYTjsgaSsrKQogICAgICAgIGZpYltpXSA9IChmaWJbaSAtIDFdICsgZmliW2kgLSAyXSkgJSBNT0Q7CgogICAgLy8gaW52ZXJzZSBwb3dlcnMgb2YgMgogICAgbG9uZyBsb25nIGludjIgPSBtb2RleHAoMiwgTU9EIC0gMik7CiAgICBpbnZfcG93MlswXSA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IE1BWE47IGkrKykKICAgICAgICBpbnZfcG93MltpXSA9IGludl9wb3cyW2kgLSAxXSAqIGludjIgJSBNT0Q7CgogICAgaW50IHQ7CiAgICBjaW4gPj4gdDsKCiAgICB3aGlsZSAodC0tKSB7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luID4+IG47CiAgICAgICAgaW50IG0gPSAyICogbjsKCiAgICAgICAgdmVjdG9yPGludD4gYShtKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgY2luID4+IGFbaV07CgogICAgICAgIC8vIGNoZWNrIGNvbmRpdGlvbiBhW2ldICsgYVtpKzFdID09IDIKICAgICAgICBib29sIG9rID0gdHJ1ZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgICAgICBpZiAoYVtpXSArIGFbKGkgKyAxKSAlIG1dICE9IDIpIHsKICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFvaykgewogICAgICAgICAgICBjb3V0IDw8IDAgPDwgJ1xuJzsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICAvLyBjaGVjayBpZiBhbGwgb25lcwogICAgICAgIGJvb2wgYWxsX29uZSA9IHRydWU7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFbaV0gIT0gMSkgewogICAgICAgICAgICAgICAgYWxsX29uZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxvbmcgbG9uZyByZXMgPSBmYWN0W21dICogaW52X3BvdzJbbl0gJSBNT0Q7CgogICAgICAgIGlmIChhbGxfb25lKSB7CiAgICAgICAgICAgIHJlcyA9IHJlcyAqIGZpYltuICsgMV0gJSBNT0Q7CiAgICAgICAgfQoKICAgICAgICBjb3V0IDw8IHJlcyA8PCAnXG4nOwogICAgfQoKICAgIHJldHVybiAwOwp9Cg==