#include using namespace std; const long long MOD = 998244353; long long pw(long long a, long long b) { long long res = 1; a %= MOD; while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD; b >>= 1; } return res; } long long inv(long long a) { return pw(a, MOD - 2); } int n; vector> a, b; vector> mul(const vector>& x, const vector>& y) { vector> c(n, vector(n, 0)); for (int i = 0; i < n; i++) for (int k = 0; k < n; k++) { if (x[i][k] == 0) continue; long long v = x[i][k]; for (int j = 0; j < n; j++) c[i][j] = (c[i][j] + v * y[k][j]) % MOD; } return c; } vector mv(const vector>& x, const vector& v) { vector res(n, 0); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) res[i] = (res[i] + x[i][j] * v[j]) % MOD; return res; } long long det(vector> a) { long long res = 1; for (int i = 0; i < n; i++) { if (a[i][i] == 0) { bool ok = false; for (int j = i + 1; j < n; j++) { if (a[j][i]) { swap(a[i], a[j]); res = (MOD - res) % MOD; ok = true; break; } } if (!ok) return 0; } long long t = inv(a[i][i]); res = res * a[i][i] % MOD; for (int j = i + 1; j < n; j++) { if (a[j][i]) { long long f = a[j][i] * t % MOD; for (int k = i; k < n; k++) a[j][k] = (a[j][k] - f * a[i][k] % MOD + MOD) % MOD; } } } return res; } vector> minv(vector> a) { vector> c(n, vector(n, 0)); for (int i = 0; i < n; i++) c[i][i] = 1; for (int i = 0; i < n; i++) { if (a[i][i] == 0) { for (int j = i + 1; j < n; j++) { if (a[j][i]) { swap(a[i], a[j]); swap(c[i], c[j]); break; } } } long long t = inv(a[i][i]); for (int j = 0; j < n; j++) { a[i][j] = a[i][j] * t % MOD; c[i][j] = c[i][j] * t % MOD; } for (int j = 0; j < n; j++) { if (i != j && a[j][i]) { long long f = a[j][i]; for (int k = 0; k < n; k++) { a[j][k] = (a[j][k] - f * a[i][k] % MOD + MOD) % MOD; c[j][k] = (c[j][k] - f * c[i][k] % MOD + MOD) % MOD; } } } } return c; } vector bm(vector s) { int m = s.size(); vector c = {1}, b = {1}; int l = 0, cnt = 1; long long ib = 1; for (int i = 0; i < m; i++) { long long d = s[i]; for (int j = 1; j <= l; j++) d = (d + c[j] * s[i - j]) % MOD; if (d == 0) { cnt++; continue; } vector tmp = c; long long f = d * inv(ib) % MOD; if ((int)c.size() < (int)b.size() + cnt) c.resize(b.size() + cnt, 0); for (int j = 0; j < (int)b.size(); j++) c[j + cnt] = (c[j + cnt] - f * b[j] % MOD + MOD) % MOD; if (2 * l <= i) { l = i + 1 - l; b = tmp; ib = d; cnt = 1; } else { cnt++; } } c.resize(l + 1); return c; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n; a.assign(n, vector(n)); b.assign(n, vector(n)); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> a[i][j]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> b[i][j]; int t = 0; long long d0 = 0; vector> x; for (t = 0; t <= n; t++) { x.assign(n, vector(n)); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) x[i][j] = (a[i][j] + (long long)t * b[i][j]) % MOD; d0 = det(x); if (d0 != 0) break; } if (d0 == 0) { for (int i = 0; i <= n; i++) cout << "0\n"; return 0; } vector> c = mul(minv(x), b); mt19937 rg(42); uniform_int_distribution rd(1, MOD - 1); vector v(n); for (int i = 0; i < n; i++) v[i] = rd(rg); vector s(2 * n); vector w = v; for (int i = 0; i < 2 * n; i++) { s[i] = w[0]; w = mv(c, w); } vector p = bm(s); reverse(p.begin(), p.end()); int deg = p.size() - 1; if (deg == n) { vector y(n + 1); for (int j = 0; j <= n; j++) { long long sg = (j % 2 == 0) ? 1 : MOD - 1; y[j] = sg * p[deg - j] % MOD * d0 % MOD; } vector> cb(n + 1, vector(n + 1, 0)); for (int i = 0; i <= n; i++) { cb[i][0] = cb[i][i] = 1; for (int j = 1; j < i; j++) cb[i][j] = (cb[i - 1][j - 1] + cb[i - 1][j]) % MOD; } vector pt(n + 1, 1); long long nt = (MOD - t) % MOD; for (int i = 1; i <= n; i++) pt[i] = pt[i - 1] * nt % MOD; vector ans(n + 1, 0); for (int k = 0; k <= n; k++) for (int j = k; j <= n; j++) ans[k] = (ans[k] + y[j] * cb[j][k] % MOD * pt[j - k]) % MOD; for (int i = 0; i <= n; i++) cout << ans[i] << "\n"; } else { vector d(n + 1); for (int xx = 0; xx <= n; xx++) { vector> m2(n, vector(n)); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) m2[i][j] = (a[i][j] + (long long)xx * b[i][j]) % MOD; d[xx] = det(m2); } for (int k = 1; k <= n; k++) for (int i = n; i >= k; i--) d[i] = (d[i] - d[i - 1] + MOD) % MOD * inv(k) % MOD; vector> ss(n + 1, vector(n + 1, 0)); ss[0][0] = 1; for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) ss[i][j] = (ss[i - 1][j - 1] - (long long)(i - 1) * ss[i - 1][j] % MOD + MOD) % MOD; vector ans(n + 1, 0); for (int k = 0; k <= n; k++) for (int j = k; j <= n; j++) ans[k] = (ans[k] + d[j] * ss[j][k]) % MOD; for (int i = 0; i <= n; i++) cout << ans[i] << "\n"; } return 0; }