結果
| 問題 |
No.2215 Slide Subset Sum
|
| コンテスト | |
| ユーザー |
tktk_snsn
|
| 提出日時 | 2023-02-11 02:44:43 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,197 bytes |
| コンパイル時間 | 236 ms |
| コンパイル使用メモリ | 82,096 KB |
| 実行使用メモリ | 448,788 KB |
| 最終ジャッジ日時 | 2024-07-07 19:35:31 |
| 合計ジャッジ時間 | 31,090 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 WA * 17 |
ソースコード
mod = 998244353
tmp = [0] * 100
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):
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 + 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, M*i+2*M)]
# 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):
answer.append(merge(dpL[j+1], dpR[j], K))
print(*answer[:N - M + 1], sep="\n")
main()
tktk_snsn