#include <cstdio>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
const int N = 20;
struct Milthm {
ll a, b;
Milthm() {
}
Milthm(ll x) {
x %= mod;
if (x > 0) {
a = x;
b = 0;
} else {
a = 1;
b = 1;
}
}
Milthm(ll a_, ll b_) {
a = a_;
b = b_;
}
ll real_val() {
return b == 0 ? a : 0;
}
};
Milthm operator + (const Milthm & a, const Milthm & b) {
if (a.b < b.b) {
return a;
}
if (a.b > b.b) {
return b;
}
ll x = (a.a + b.a) % mod;
if (x == 0) {
return Milthm(1, a.b + 1);
} else {
return Milthm(x, a.b);
}
}
Milthm & operator += (Milthm & a, const Milthm & b) {
return a = a + b;
}
Milthm operator - (const Milthm & a) {
return Milthm(mod - a.a, a.b);
}
Milthm & operator -= (Milthm & a, const Milthm & b) {
return a += -b;
}
Milthm operator * (const Milthm & a, const Milthm & b) {
return Milthm(a.a * b.a % mod, a.b + b.b);
}
Milthm & operator *= (Milthm & a, const Milthm & b) {
return a = a * b;
}
int n;
ll a[1 << N];
ll qpow(ll a, ll b) {
if (a < 0) {
a += mod;
}
if (b < 0) {
b += mod - 1;
}
ll ans = 1;
while (b > 0) {
if (b % 2 == 1) {
(ans *= a) %= mod;
}
(a *= a) %= mod;
b /= 2;
}
return ans;
}
Milthm inv(Milthm x) {
return Milthm(qpow(x.a, mod - 2), -x.b);
}
int read() {
int x = 0, ch;
do {
ch = getchar();
} while ('0' > ch);
do {
x = x * 10 + ch - 48;
ch = getchar();
} while ('0' <= ch);
return x;
}
Milthm f[1 << N], g[1 << N], h[1 << N];
int main() {
// freopen("in.txt", "r", stdin);
read();
int t = read();
for (; t != 0; t--) {
n = read();
for (int i = 0; i < (1 << n); i++) {
a[i] = read();
f[i] = Milthm(a[i] + 1);
g[i] = Milthm(2 * a[i] + 1) * inv(a[i] + 1) * inv(a[i] + 1);
}
for (int i = 0; i < n; i++) {
for (int S = 0; S < (1 << n); S++) {
if (((S >> i) & 1) == 0) {
f[S] *= f[S | (1 << i)];
g[S] *= g[S | (1 << i)];
}
}
}
for (int S = 0; S < (1 << n); S++) {
f[S] *= qpow(-2, __builtin_popcount(S));
g[S] *= qpow(2, -__builtin_popcount(S));
}
for (int i = 0; i < n; i++) {
for (int S = 0; S < (1 << n); S++) {
if (((S >> i) & 1) == 0) {
f[S | (1 << i)] += f[S];
}
}
}
for (int S = 0; S < (1 << n); S++) {
h[S] = f[S] * f[S];
}
for (int i = 0; i < n; i++) {
for (int S = 0; S < (1 << n); S++) {
if (((S >> i) & 1) == 0) {
h[S | (1 << i)] -= h[S];
}
}
}
Milthm ans = 0;
for (int S = 0; S < (1 << n); S++) {
ans += h[S] * g[S];
}
printf("%lld\n", ans.real_val());
}
return 0;
}