#include <bits/stdc++.h>
using namespace std;
const int maxn = 59;
const long long mod = 998244353;
int add[maxn];
long long w[maxn];
long long dp[52][52][52];
long long val[52][52][52];
bool vis[52][52][52];
long long Pow(long long a, long long b) {
  long long res = 1;
  a %= mod;
  while (b) {
    if (b & 1) res = res * a % mod;
    b >>= 1;
    a = a * a % mod;
  }
  return res;
}
inline long long inv(long long a) { return Pow(a, mod - 2); }
int flag;
long long dfs(int step, long long p, int i, int j, int k, long long x,
              long long y, long long z) {
  if (step == 0) return p * x % mod;
  if (vis[i][j][k]) {
    return val[i][j][k] * inv(dp[i][j][k]) % mod * p % mod;
  }
  dp[i][j][k] = p;
  val[i][j][k] += dfs(step - 1, p * x % mod * inv(x + y + z) % mod, i + 1, j, k,
                      max(0ll, x + flag), y, z);
  val[i][j][k] += dfs(step - 1, p * y % mod * inv(x + y + z) % mod, i, j + 1, k,
                      x, y + 1, z);
  val[i][j][k] += dfs(step - 1, p * z % mod * inv(x + y + z) % mod, i, j, k + 1,
                      x, y, max(0ll, z - 1));
  val[i][j][k] %= mod;
  vis[i][j][k] = 1;
  return val[i][j][k];
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  long long ori, s0 = 0, s1 = 0;
  for (int i = 1; i <= n; i++) scanf("%d", add + i);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", w + i);
    if (add[i])
      s1 += w[i];
    else
      s0 += w[i];
  }
  ori = s0 + s1;
  int x, y, z, step;
  for (int i = 1; i <= n; i++) {
    memset(dp, 0, sizeof dp);
    memset(val, 0, sizeof val);
    memset(vis, 0, sizeof vis);
    if (add[i])
      flag = 1, val[0][0][0] = dfs(m, 1, 0, 0, 0, w[i], s1 - w[i], s0);
    else
      flag = -1, val[0][0][0] = dfs(m, 1, 0, 0, 0, w[i], s1, s0 - w[i]);
    printf("%lld\n", val[0][0][0]);
  }
}
