#include <bits/stdc++.h>
using namespace std;
int N, M;
int a[55], w[55];
long long qpow(long long x, int n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = res * x % int(998244353);
    x = x * x % int(998244353);
    n /= 2;
  }
  return res;
}
long long inv(long long x) { return qpow(x, int(998244353) - 2); }
long long s[2];
long long memo[55][55][55];
long long dfs(int id, int i, int j, int k) {
  if (memo[i][j][k] != -1) return memo[i][j][k];
  long long w1;
  if (a[id] == 0) w1 = w[id] - j;
  if (a[id] == 1) w1 = w[id] + j;
  if (i == M + 1) return memo[i][j][k] = w1;
  long long p = w1 * inv(s[0] + s[1] + (i - 1) - 2 * k) % int(998244353);
  long long ans = 0;
  if (p > 0)
    ans =
        p * dfs(id, i + 1, j + 1, k + ((a[id] == 0) ? 1 : 0)) % int(998244353);
  if (p != 1) {
    long long p0 = (s[0] - k - ((a[id] == 0) ? w1 : 0)) *
                   inv(s[0] + s[1] + (i - 1) - 2 * k) % int(998244353);
    long long p1 = (1 - p - p0 + 2 * int(998244353)) % int(998244353);
    ans =
        (ans + p0 * dfs(id, i + 1, j, k + 1) % int(998244353)) % int(998244353);
    ans = (ans + p1 * dfs(id, i + 1, j, k) % int(998244353)) % int(998244353);
  }
  return memo[i][j][k] = ans;
}
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];
    s[a[i]] += w[i];
  }
  for (int i = 1; i <= N; i++) {
    memset(memo, -1, sizeof(memo));
    cout << dfs(i, 1, 0, 0) << endl;
  }
  return 0;
}
