#include #include #include #include using usize = std::size_t; using i64 = std::int64_t; template void kronecker(const F f, std::vector &a) { const usize n = a.size(); for (usize w = 1; w != n; w *= 2) { for (usize k = 0; k != n; k += w * 2) { for (usize i = 0; i != w; ++i) { f(a[k + i], a[k + w + i]); } } } } static constexpr i64 MOD = 998244353; i64 mod(i64 x) { x %= MOD; if (x < 0) { x += MOD; } return x; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); usize N; std::cin >> N; const usize m = 1 << N; std::vector A(m), B(m); for (i64 &e : A) { std::cin >> e; } for (i64 &e : B) { std::cin >> e; } kronecker([](i64 &l, i64 &r) { l += r; }, A); kronecker([](i64 &l, i64 &r) { r -= l; }, B); std::vector C(m); for (usize i = 0; i != m; ++i) { C[i] = mod(mod(A[i]) * mod(B[i])); } kronecker([](i64 &l, i64 &r) { r += l; }, C); for (usize i = 0; i != m; ++i) { std::cout << mod(C[i]) << " \n"[i + 1 == m]; } return 0; }