#include <bits/stdc++.h>
using namespace std;
long long len, ans, s0, s1, s2, fac[2001], invfac[2001], S[2001][2001],
    lst[2001], n, a[2001], b[2001], pv[2001], nxt[2001], F[2001], f[2001],
    G[2001], g[2001], h[2001], k[2001], K[2001], minn[2001];
int read() {
  char c = 0;
  int sum = 0;
  while (c < '0' || c > '9') c = getchar();
  while ('0' <= c && c <= '9') {
    sum = sum * 10 + c - '0';
    c = getchar();
  }
  return sum;
}
long long fast_pow(long long a, int b) {
  if (b == 0) return 1;
  if (b & 1)
    return fast_pow(a * a % 998244353, b / 2) * a % 998244353;
  else
    return fast_pow(a * a % 998244353, b / 2);
}
long long A(int x, int y) { return fac[x] * invfac[x - y] % 998244353; }
long long C(int x, int y) {
  return fac[x] * invfac[x - y] % 998244353 * invfac[y] % 998244353;
}
int main() {
  n = read();
  for (int i = 1; i <= n; ++i) a[i] = read();
  for (int i = 1; i <= n; ++i) b[i] = read();
  for (int i = 1; i <= n; ++i) nxt[i] = pv[i] = -1;
  for (int i = 1; i <= n; ++i) {
    nxt[a[i]] = b[i];
    pv[b[i]] = a[i];
  }
  for (int i = 1; i <= n; ++i) {
    lst[i] = i;
    minn[i] = i;
    while (nxt[lst[i]] != i && nxt[lst[i]] != 0 && nxt[lst[i]] != -1) {
      lst[i] = nxt[lst[i]];
      minn[i] = min(minn[i], lst[i]);
    }
    lst[i] = nxt[lst[i]];
  }
  for (int i = 1; i <= n; ++i) {
    if (a[i] == 0 && b[i] > 0 && lst[b[i]] == -1) s1++;
    if (a[i] == 0 && b[i] > 0 && lst[b[i]] == 0) s2++;
    if (a[i] == 0 && b[i] == 0) s2++;
    if (a[i] > 0 && lst[a[i]] == a[i] && minn[a[i]] == a[i]) ans++;
    if (a[i] > 0 && lst[a[i]] == 0 && pv[a[i]] == -1) s0++;
  }
  fac[0] = 1;
  for (int i = 1; i <= 2000; ++i) fac[i] = fac[i - 1] * i % 998244353;
  invfac[2000] = fast_pow(fac[2000], 998244353 - 2);
  for (int i = 1999; i >= 0; --i)
    invfac[i] = invfac[i + 1] * (i + 1) % 998244353;
  S[0][0] = 1;
  for (int i = 1; i <= 2000; ++i)
    for (int j = 1; j <= i; ++j)
      S[i][j] =
          (S[i - 1][j] * (i - 1) % 998244353 + S[i - 1][j - 1]) % 998244353;
  for (int i = 0; i <= s0; ++i)
    for (int j = i; j <= s0; ++j)
      F[i] = (F[i] + C(s0, j) * S[j][i] % 998244353 * A(s0 - j + s2, s0 - j) %
                         998244353) %
             998244353;
  for (int i = 0; i <= s0; ++i)
    for (int j = i; j <= s0; ++j) {
      if ((j - i) % 2 == 0)
        f[i] = (f[i] + F[j] * C(j, i) % 998244353) % 998244353;
      else
        f[i] = (f[i] - F[j] * C(j, i) % 998244353) % 998244353;
    }
  for (int i = 0; i <= s1; ++i)
    for (int j = i; j <= s1; ++j)
      G[i] = (G[i] + C(s1, j) * S[j][i] % 998244353 * A(s1 - j + s2, s1 - j) %
                         998244353) %
             998244353;
  for (int i = 0; i <= s1; ++i)
    for (int j = i; j <= s1; ++j) {
      if ((j - i) % 2 == 0)
        g[i] = (g[i] + G[j] * C(j, i) % 998244353) % 998244353;
      else
        g[i] = (g[i] - G[j] * C(j, i) % 998244353) % 998244353;
    }
  for (int i = 0; i <= s2; ++i) h[i] = S[s2][i] * fac[s2] % 998244353;
  for (int i = 0; i <= s0; ++i)
    for (int j = 0; j <= s1; ++j)
      k[i + j] = (k[i + j] + f[i] * g[j] % 998244353) % 998244353;
  for (int i = 0; i <= s0 + s1; ++i)
    for (int j = 0; j <= s2; ++j)
      K[i + j] = (K[i + j] + k[i] * h[j] % 998244353) % 998244353;
  puts("");
  for (int i = n; i >= 1; --i) {
    if (i < ans)
      printf("%lld ", 0);
    else
      printf("%lld ", (K[i - ans] + 998244353) % 998244353);
  }
  puts("");
  return 0;
}
