from itertools import accumulate
def add_loop(m, loop_ans, si, k, b):
""" ループ内位置 si から k 個に渡って b を加算することを表現するように累積和を更新 """
if k <= 0:
return
loop_rem = m - si # 1周目の末端までの残り個数
if k <= loop_rem:
loop_ans[si] += b
loop_ans[si + k] -= b
return
loop_ans[si] += b
loop_ans[m] -= b
entire_loop, last_loop = divmod(k - loop_rem, m)
loop_ans[0] += b * (entire_loop + 1)
loop_ans[m] -= b * entire_loop
loop_ans[last_loop] -= b
def solve(loop):
m = len(loop)
loop_ans = [0] * (m + 1) # ループ内累積和
# 各ループ内頂点に付き、以下を累積和で更新
# ①自身からループ内への影響
# ②自身へ至るループ外の枝からループ内への影響
# ③自身へ至るループ外の枝から、同じ枝への影響
for li in range(m):
u = loop[li]
nxt_i = (li + 1) % m
prev_in_loop = loop[(li - 1) % m]
# ①
add_loop(m, loop_ans, nxt_i, k, bbb[loop[li]])
# ②③
path = [u]
while path:
v = path[-1]
if progress[v] == len(prev[v]):
if v != u:
# 自身の影響を反映
b = bbb[v]
ans[aaa[v]] += b
if len(path) > k + 1:
# ③ Kが同じ枝で終わる
ans[path[-k - 2]] -= b
else:
# ② Kがループ内に影響する
add_loop(m, loop_ans, nxt_i, k - len(path) + 1, b)
# 次へ累積和を引き継ぐ
ans[v] %= MOD
ans[aaa[v]] += ans[v]
path.pop()
else:
w = prev[v][progress[v]]
progress[v] += 1
if w == prev_in_loop:
continue
path.append(w)
loop_ans = list(accumulate(loop_ans))
for li, v in enumerate(loop):
ans[v] += loop_ans[li]
ans[v] %= MOD
n, k = map(int, input().split())
aaa = list(map(int, input().split()))
aaa = [a - 1 for a in aaa]
bbb = list(map(int, input().split()))
MOD = 998244353
prev = [[] for _ in range(n)]
for i, a in enumerate(aaa):
prev[a].append(i)
checked = [False] * n
progress = [0] * n
ans = [0] * n
for s in range(n):
if checked[s]:
continue
# ループを検出
path = []
v = s
while checked[v] == False:
checked[v] = True
path.append(v)
v = aaa[v]
try:
loop_start = path.index(v)
except:
# 到達できるループは既に他の枝から調べられているので、調べる必要なし
continue
loop = path[loop_start:]
solve(loop)
inv_k = pow(k, MOD - 2, MOD)
ans = [a * inv_k % MOD for a in ans]
print(*ans)