#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <iostream>
using namespace std;
const unsigned int MOD = 998244353;
// Đưa về mảng 1 chiều x 24 để tận dụng thanh ghi AVX2 (256-bit = 8 số int x 3)
// Đảo chiều mảng thành f[mask][k] để tối ưu Cache locality
alignas(32) unsigned int f[1 << 20][24];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
freopen("tamphan.inp" , "r" , stdin);
freopen("tamphan.out" , "w" , stdout);
int n;
if (!(cin >> n)) return 0;
int size = 1 << n;
for (int i = 0; i < size; ++i) {
unsigned int val;
cin >> val;
f[i][__builtin_popcount(i)] = val;
}
// 1. FMT / SOS DP
for (int len = 1; len < size; len <<= 1) {
for (int i = 0; i < size; i += 2 * len) {
for (int j = 0; j < len; ++j) {
unsigned int *u = f[i + j];
unsigned int *v = f[i + len + j];
for (int k = 0; k <= n; ++k) {
unsigned int sum = v[k] + u[k];
// Phép cộng không nhánh (branchless) thay cho modulo
v[k] = (sum >= MOD) ? sum - MOD : sum;
}
}
}
}
// 2. Nhân chập đa thức (Tính trực tiếp không cần mảng h)
for (int mask = 0; mask < size; ++mask) {
unsigned int* fm = f[mask];
unsigned long long P[24] = {0};
// Tính f * f
for (int i = 0; i <= n; ++i) {
unsigned long long fi = fm[i];
if (!fi) continue;
for (int j = 0; i + j <= n; ++j) {
P[i + j] += fi * fm[j];
}
// Mẹo siêu tốc độ: Modulo sau 16 vòng lặp để tránh uint64_t bị tràn
// Thay vì modulo sau mỗi vòng bên trong, tiết kiệm hàng triệu phép tính
if (i == 15) {
for (int k = 0; k <= n; ++k) P[k] %= MOD;
}
}
for (int k = 0; k <= n; ++k) P[k] %= MOD;
// Tính (f * f) * f
unsigned long long H[24] = {0};
for (int i = 0; i <= n; ++i) {
unsigned long long pi = P[i];
if (!pi) continue;
for (int j = 0; i + j <= n; ++j) {
H[i + j] += pi * fm[j];
}
if (i == 15) {
for (int k = 0; k <= n; ++k) H[k] %= MOD;
}
}
// Cập nhật lại mảng f (In-place)
for (int k = 0; k <= n; ++k) fm[k] = H[k] % MOD;
}
// 3. IFMT / Inverse SOS DP
for (int len = 1; len < size; len <<= 1) {
for (int i = 0; i < size; i += 2 * len) {
for (int j = 0; j < len; ++j) {
unsigned int *u = f[i + j];
unsigned int *v = f[i + len + j];
for (int k = 0; k <= n; ++k) {
unsigned int diff = v[k] + MOD - u[k];
v[k] = (diff >= MOD) ? diff - MOD : diff;
}
}
}
}
// 4. In ra kết quả
for (int i = 0; i < size; ++i) {
cout << f[i][__builtin_popcount(i)] << (i == size - 1 ? "" : " ");
}
cout << "\n";
return 0;
}