#include <bits/stdc++.h>
using namespace std;
int n, m;
bool a[51];
int w[51];
long long W, Wp, Wn;
long long P[2][51][51][103];
long long r[51];
long long Wl[103];
long long r2;
long long q_pow(long long a, long long n) {
  long long res = 1;
  for (; n; n >>= 1) {
    if (n & 1) res = res * a % 998244353;
    a = a * a % 998244353;
  }
  return res;
}
inline long long frac_m(long long a, long long b) {
  if (a <= 0) return 0;
  return a * q_pow(b, 998244353 - 2) % 998244353;
}
inline long long frac_s(long long a, long long l) {
  if (a <= 0) return 0;
  return a * Wl[l + 51] % 998244353;
}
inline long long frac_d(long long a, long long l) {
  return frac_s(a, l) * r2 % 998244353;
}
inline long long Q(int j, int k, int l) {
  return a[j] ? frac_s(w[j] + k, l) : frac_s(w[j] - k, l);
}
inline long long Qp(int i, int l) { return frac_d((Wp << 1) + l + i, l); }
inline long long Qn(int i, int l) { return frac_d((Wn << 1) + l - i, l); }
inline int curr(int i) { return i & 1; }
inline int next(int i) { return (i & 1) ^ 1; }
inline int prev(int i) { return (i & 1) ^ 1; }
void init() {
  r2 = q_pow(2, 998244353 - 2);
  for (int l = -51; l <= 51; l++) {
    Wl[51 + l] = q_pow(W + l, 998244353 - 2);
  }
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) {
    cin >> w[i];
    W += w[i];
    if (a[i])
      Wp += w[i];
    else
      Wn += w[i];
    P[0][i][0][51] = 1;
  }
  init();
  for (int i = 1; i <= m; i++) {
    for (int j = 1; j <= n; j++) {
      for (int l = -i; l <= i; l++) {
        if (a[j]) {
          P[curr(i)][j][0][l + 51] =
              (P[prev(i)][j][0][l + 50] *
                   (Qp(i - 1, l - 1) - Q(j, 0, l - 1) + 998244353) % 998244353 +
               P[prev(i)][j][0][l + 52] * Qn(i - 1, l + 1) % 998244353) %
              998244353;
        } else {
          P[curr(i)][j][0][l + 51] =
              (P[prev(i)][j][0][l + 52] *
                   (Qn(i - 1, l + 1) - Q(j, 0, l + 1) + 998244353) % 998244353 +
               P[prev(i)][j][0][l + 50] * Qp(i - 1, l - 1) % 998244353) %
              998244353;
        }
      }
      for (int k = 1; k <= i; k++) {
        for (int l = -i; l <= i; l++) {
          if (a[j]) {
            P[curr(i)][j][k][l + 51] =
                (P[prev(i)][j][k][l + 50] *
                     (Qp(i - 1, l - 1) - Q(j, k, l - 1) + 998244353) %
                     998244353 +
                 P[prev(i)][j][k][l + 52] * Qn(i - 1, l + 1) % 998244353 +
                 P[prev(i)][j][k - 1][l + 50] * Q(j, k - 1, l - 1) %
                     998244353) %
                998244353;
          } else {
            P[curr(i)][j][k][l + 51] =
                (P[prev(i)][j][k][l + 52] *
                     (Qn(i - 1, l + 1) - Q(j, k, l + 1) + 998244353) %
                     998244353 +
                 P[prev(i)][j][k][l + 50] * Qp(i - 1, l - 1) % 998244353 +
                 P[prev(i)][j][k - 1][l + 52] * Q(j, k - 1, l + 1) %
                     998244353) %
                998244353;
          }
        }
        if (!a[j] && k == w[j]) break;
      }
    }
  }
  for (int j = 1; j <= n; j++) {
    long long e = 0;
    for (int k = 0; k <= m; k++) {
      long long p = 0;
      for (int l = -m; l <= m; l++) {
        p = (p + P[curr(m)][j][k][l + 51]) % 998244353;
      }
      if (a[j]) {
        e = (e + p * (w[j] + k)) % 998244353;
      } else {
        e = (e + p * (w[j] - k)) % 998244353;
      }
    }
    r[j] = e;
  }
  for (int i = 1; i <= n; i++) cout << r[i] << endl;
  return 0;
}
