#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long inf_ll = 1e18;
template <long long M>
struct modint {
  static long long _reduce(long long n) {
    constexpr static long long b = -1ull / M;
    long long r = n - (long long)(__uint128_t(b) * n >> 64) * M;
    return r >= M ? r - M : r;
  }
  static long long _pow(long long n, long long k) {
    long long r = 1;
    for (; k > 0; k >>= 1, n = _reduce(n * n))
      if (k & 1) r = _reduce(r * n);
    return r;
  }
  long long v;
  modint(long long n = 0) : v(_reduce(n)) { v += (M & (0 - (v < 0))); }
  friend string to_string(const modint n) { return to_string(n.v); }
  friend istream& operator>>(istream& i, modint& n) { return i >> n.v; }
  friend ostream& operator<<(ostream& o, const modint n) { return o << n.v; }
  template <typename T>
  explicit operator T() {
    return T(v);
  }
  friend bool operator==(const modint n, const modint m) { return n.v == m.v; }
  friend bool operator!=(const modint n, const modint m) { return n.v != m.v; }
  friend bool operator<(const modint n, const modint m) { return n.v < m.v; }
  friend bool operator<=(const modint n, const modint m) { return n.v <= m.v; }
  friend bool operator>(const modint n, const modint m) { return n.v > m.v; }
  friend bool operator>=(const modint n, const modint m) { return n.v >= m.v; }
  modint& operator+=(const modint n) {
    v += n.v;
    v -= (M & (0 - (v >= M)));
    return *this;
  }
  modint& operator-=(const modint n) {
    v -= n.v;
    v += (M & (0 - (v < 0)));
    return *this;
  }
  modint& operator*=(const modint n) {
    v = _reduce(v * n.v);
    return *this;
  }
  modint& operator/=(const modint n) {
    v = _reduce(v * _pow(n.v, M - 2));
    return *this;
  }
  friend modint operator+(const modint n, const modint m) {
    return modint(n) += m;
  }
  friend modint operator-(const modint n, const modint m) {
    return modint(n) -= m;
  }
  friend modint operator*(const modint n, const modint m) {
    return modint(n) *= m;
  }
  friend modint operator/(const modint n, const modint m) {
    return modint(n) /= m;
  }
  modint& operator++() { return *this += 1; }
  modint& operator--() { return *this -= 1; }
  modint operator++(int) {
    modint t = *this;
    return *this += 1, t;
  }
  modint operator--(int) {
    modint t = *this;
    return *this -= 1, t;
  }
  modint operator+() { return *this; }
  modint operator-() { return modint(0) -= *this; }
  modint pow(const long long k) const {
    return k < 0 ? _pow(v, M - 1 - (-k % (M - 1))) : _pow(v, k);
  }
  modint inv() const { return _pow(v, M - 2); }
};
using mod = modint<998244353>;
const int N = 2e5 + 5, M = 3005;
int a[N];
mod w[N], dp[M][M];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) cin >> a[i];
  mod x = 0, y = 0;
  for (int i = 0; i < n; i++) {
    cin >> w[i];
    (a[i] ? y : x) += w[i];
  }
  dp[0][0] = 1;
  for (int i = 0; i <= m; i++)
    for (int j = 0; j <= m; j++) {
      dp[i + 1][j] += dp[i][j] * (x - i) / (x + y - i + j);
      dp[i][j + 1] += dp[i][j] * (y + j) / (x + y - i + j);
    }
  mod p = 0;
  for (int i = 0; i <= m; i++) p += i * dp[m - i][i];
  for (int i = 0; i < n; i++)
    cout << (a[i] ? w[i] + p * w[i] / y : w[i] - (m - p) * w[i] / x) << "\n";
}
