#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long extgcd(long long a, long long b, long long& x, long long& y) {
  long long d = a;
  if (b != 0LL) {
    d = extgcd(b, a % b, y, x);
    y -= (a / b) * x;
  } else {
    x = 1;
    y = 0;
  }
  return d;
}
long long mod_inverse(long long a, long long m) {
  long long x, y;
  extgcd(a, m, x, y);
  return (m + x % m) % m;
}
long long fact[200005];
long long mod_fact(long long n, long long p, long long& e) {
  e = 0;
  if (n == 0) return 1;
  long long res = mod_fact(n / p, p, e);
  e += n / p;
  if (n / p % 2 != 0) {
    return res * (p - fact[n % p]) % p;
  }
  return res * fact[n % p] % p;
}
long long mod_comb(long long n, long long k, long long p) {
  if (n < 0 || k < 0 || n < k) return 0;
  long long e1, e2, e3;
  long long a1 = mod_fact(n, p, e1), a2 = mod_fact(k, p, e2),
            a3 = mod_fact(n - k, p, e3);
  if (e1 > e2 + e3) return 0;
  return a1 * mod_inverse(a2 * a3 % p, p) % p;
}
int n, m;
int a[200005];
long long w[200005];
long long sumw = 0;
long long sum_n = 0;
long long sum_p = 0;
long long dp[3005][3005];
long long dp2[3005][3005];
long long inv[6005];
int main(void) {
  fact[0] = 1;
  for (long long i = 1; i <= 200000; i++) {
    fact[i] = fact[i - 1] * i % 998244353LL;
  }
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i]);
    if (a[i] == 0) {
      a[i] = -1;
    }
  }
  for (int i = 0; i < n; i++) {
    scanf("%lld", &w[i]);
    sumw += w[i];
    if (a[i] == -1) {
      sum_n += w[i];
    } else {
      sum_p += w[i];
    }
  }
  for (int i = 0; i <= m * 2; i++) {
    inv[i] = mod_inverse(sumw + i - m, 998244353LL);
  }
  for (int k = m; k >= 0; k--) {
    for (int i = 0; i <= k; i++) {
      int j = k - i;
      if (j > sum_n) continue;
      if (k == m) {
        dp[i][j] = 1;
      } else {
        long long val = sum_p + i + 1;
        long long val2 = sumw + i - j;
        val = val * inv[m + i - j] % 998244353LL;
        dp[i][j] = val * dp[i + 1][j] % 998244353LL;
        val = sum_n - j;
        val2 = sumw + i - j;
        val = val * inv[m + i - j] % 998244353LL;
        dp[i][j] += val * dp[i][j + 1] % 998244353LL;
        dp[i][j] %= 998244353LL;
      }
    }
  }
  for (int k = m; k >= 0; k--) {
    for (int i = 0; i <= k; i++) {
      int j = k - i;
      if (j > sum_n) continue;
      if (k == m) {
        dp2[i][j] = 1;
      } else {
        long long val = sum_p + i;
        long long val2 = sumw + i - j;
        val = val * inv[m + i - j] % 998244353LL;
        dp2[i][j] = val * dp2[i + 1][j] % 998244353LL;
        val = sum_n - j - 1;
        val2 = sumw + i - j;
        val = val * inv[m + i - j] % 998244353LL;
        dp2[i][j] += val * dp2[i][j + 1] % 998244353LL;
        dp2[i][j] %= 998244353LL;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (a[i] == -1) {
      printf("%lld\n", dp2[0][0] * w[i] % 998244353LL);
    } else {
      printf("%lld\n", dp[0][0] * w[i] % 998244353LL);
    }
  }
  return 0;
}
