mod = 998244353 def merge(X, Y, K): res = X[0] * Y[0] - 1 for i in range(1, K): res += X[i] * Y[K - i] res %= mod return res def calc_dp(dp, K, A): if not A: return for i in range(K): dp[0][i] = 0 dp[0][0] = 1 dp[0][A[0]] = 1 for i, a in enumerate(A[1:], 1): for j in range(K): dp[i][j] = dp[i-1][j] + dp[i-1][j-a] if dp[i][j] >= mod: dp[i][j] -= mod def main(): N, M, K = map(int, input().split()) block = (N + M - 1) // M A = [0] * (block * M) for i, a in enumerate(map(int, input().split())): A[i] = a dpL = [[0] * K for _ in range(M)] dpR = [[0] * K for _ in range(M)] answer = [] for i in range(block): L = [A[j] for j in range(M*i, M*i+M)][::-1] R = [A[j] for j in range(M*i+M, min(M*i+M+M, len(A)))] # dpL = list(calc_dp(K, L))[::-1] # dpR = list(calc_dp(K, R)) calc_dp(dpL, K, L) dpL.reverse() calc_dp(dpR, K, R) answer.append((dpL[0][0] - 1) % mod) for j in range(M - 1): if j >= len(R): break answer.append(merge(dpL[j+1], dpR[j], K)) print(*answer[:N - M + 1], sep="\n") main()