← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

const MOD int64 = 998244353

func modPow(a, e int64) int64 {
	a %= MOD
	if a < 0 {
		a += MOD
	}
	res := int64(1)
	for e > 0 {
		if e&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		e >>= 1
	}
	return res
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	var n, m int
	fmt.Fscan(in, &n, &m)

	a := make([]int, n)
	w := make([]int64, n)

	for i := 0; i < n; i++ {
		fmt.Fscan(in, &a[i])
	}

	var A, B int64
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &w[i])
		if a[i] == 1 {
			A += w[i]
		} else {
			B += w[i]
		}
	}

	S := A + B
	invDen := make([]int64, 2*m+1)
	for d := -m; d <= m; d++ {
		val := S + int64(d)
		if val > 0 {
			invDen[d+m] = modPow(val, MOD-2)
		}
	}

	invA := modPow(A, MOD-2)
	var invB int64
	if B > 0 {
		invB = modPow(B, MOD-2)
	}

	dp := make([]int64, m+2)
	ndp := make([]int64, m+2)
	dp[0] = 1

	for i := 0; i < m; i++ {
		for k := 0; k <= i+1; k++ {
			ndp[k] = 0
		}
		for j := 0; j <= i; j++ {
			cur := dp[j]
			if cur == 0 {
				continue
			}
			like := A + int64(j)
			dis := B - int64(i-j)
			if dis < 0 {
				continue
			}
			inv := invDen[2*j-i+m]
			if like > 0 {
				v := cur * (like % MOD) % MOD * inv % MOD
				ndp[j+1] += v
				if ndp[j+1] >= MOD {
					ndp[j+1] -= MOD
				}
			}
			if dis > 0 {
				v := cur * (dis % MOD) % MOD * inv % MOD
				ndp[j] += v
				if ndp[j] >= MOD {
					ndp[j] -= MOD
				}
			}
		}
		dp, ndp = ndp, dp
	}

	var expLike, expDis int64
	for j := 0; j <= m; j++ {
		if dp[j] == 0 {
			continue
		}
		expLike = (expLike + dp[j]*((A+int64(j))%MOD)) % MOD
		if B > 0 {
			disFinal := B - int64(m-j)
			if disFinal >= 0 {
				expDis = (expDis + dp[j]*(disFinal%MOD)) % MOD
			}
		}
	}

	for i := 0; i < n; i++ {
		var ans int64
		if a[i] == 1 {
			ans = (w[i] % MOD) * invA % MOD * expLike % MOD
		} else {
			ans = (w[i] % MOD) * invB % MOD * expDis % MOD
		}
		if i > 0 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, ans)
	}
	fmt.Fprintln(out)
}
```