結果
| 問題 | No.137 貯金箱の焦り |
| コンテスト | |
| ユーザー |
昆布
|
| 提出日時 | 2026-09-03 17:02:16 |
| 言語 | PyPy3 (7.3.23) |
| 結果 |
AC
|
| 実行時間 | 1,147 ms / 5,000 ms |
| + 642µs | |
| コード長 | 778 bytes |
| 記録 | |
| コンパイル時間 | 262 ms |
| コンパイル使用メモリ | 95,820 KB |
| 実行使用メモリ | 303,360 KB |
| 最終ジャッジ日時 | 2026-09-03 17:02:30 |
| 合計ジャッジ時間 | 8,896 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
N, M = map(int, input().split())
A = [int(x) for x in input().split()]
mod = 1234567891
S = sum(A)
# dp[j]: (M % 2**x) + j * 2**x 円払う方法の数
dp = [1]
for x in range(60):
# 各硬貨を、2**x 枚 使うか使わないか選ぶ
for i in range(N):
ndp = [0] * (S * 2 + 1)
for m in range(len(dp)):
if dp[m] > 0:
ndp[m + A[i]] = (ndp[m + A[i]] + dp[m]) % mod
ndp[m] = (ndp[m] + dp[m]) % mod
dp = ndp
# 2**(x + 1)で割ったあまりがMと一致しないものは不要
# → j の偶奇が M の第 x ビットと一致するものだけ残し、j を (j - bit) // 2 に詰め直す
if (M >> x) & 1 == 0:
dp = dp[::2]
else:
dp = dp[1::2]
print(dp[0])
昆布