This documentation is automatically generated by online-judge-tools/verification-helper
#define PROBLEM "https://judge.yosupo.jp/problem/bitwise_xor_convolution"
#include <bits/stdc++.h>
using namespace std;
#include "../convolution/xor_convolution.cpp"
#include "../modint/modint.cpp"
using mint = Modint<998244353>;
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<mint> a(1 << n), b(1 << n);
for(int i = 0; i < 1 << n; i++) {
long long in;
cin >> in;
a[i] = in;
}
for(int i = 0; i < 1 << n; i++) {
long long in;
cin >> in;
b[i] = in;
}
auto ans = xorConvolution::convolution(a, b);
for(int i = 0; i < 1 << n; i++)
cout << ans[i].x << " \n"[(i + 1) == 1 << n];
}
#line 1 "test/yosupo-bitwise_xor_convolution.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/bitwise_xor_convolution"
#include <bits/stdc++.h>
using namespace std;
#line 3 "convolution/xor_convolution.cpp"
using namespace std;
class xorConvolution {
template <typename T>
static void FWT(vector<T>& f) {
int n = f.size();
for(int i = 1; i < n; i <<= 1)
for(int j = 0; j < n; j++)
if((j & i) == 0) {
T x = f[j], y = f[j | i];
f[j] = x + y, f[j | i] = x - y;
}
}
public:
template <typename T>
static vector<T> convolution(vector<T> f, vector<T> g) {
int sz = 1, n = max(f.size(), g.size());
while(sz < n) sz <<= 1;
f.resize(sz);
g.resize(sz);
FWT(f);
FWT(g);
for(int i = 0; i < sz; i++) f[i] *= g[i];
FWT(f);
for(int i = 0; i < sz; i++) f[i] /= sz;
return f;
}
};
#line 2 "modint/modint.cpp"
template <long long MOD>
struct Modint {
long long x;
Modint(long long x_ = 0) : x(x_ % MOD) {
if(x < 0) x += MOD;
}
friend Modint operator+(Modint a, Modint b) { return a.x + b.x; }
friend Modint operator-(Modint a, Modint b) { return a.x - b.x; }
friend Modint operator*(Modint a, Modint b) { return a.x * b.x; }
friend Modint operator/(Modint a, Modint b) { return a * b.inv(); }
// 4 行コピペ Alt + Shift + クリックで複数カーソル
friend Modint& operator+=(Modint& a, Modint b) { return a = a.x + b.x; }
friend Modint& operator-=(Modint& a, Modint b) { return a = a.x - b.x; }
friend Modint& operator*=(Modint& a, Modint b) { return a = a.x * b.x; }
friend Modint& operator/=(Modint& a, Modint b) { return a = a * b.inv(); }
Modint inv() const { return pow(MOD - 2); }
Modint pow(long long b) const {
Modint a = *this, c = 1;
while(b) {
if(b & 1) c *= a;
a *= a;
b >>= 1;
}
return c;
}
};
#line 8 "test/yosupo-bitwise_xor_convolution.test.cpp"
using mint = Modint<998244353>;
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<mint> a(1 << n), b(1 << n);
for(int i = 0; i < 1 << n; i++) {
long long in;
cin >> in;
a[i] = in;
}
for(int i = 0; i < 1 << n; i++) {
long long in;
cin >> in;
b[i] = in;
}
auto ans = xorConvolution::convolution(a, b);
for(int i = 0; i < 1 << n; i++)
cout << ans[i].x << " \n"[(i + 1) == 1 << n];
}