結果
| 問題 | No.3480 Prefix Advantage |
| コンテスト | |
| ユーザー |
👑 potato167
|
| 提出日時 | 2026-03-20 20:19:35 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 1,815 bytes |
| 記録 | |
| コンパイル時間 | 821 ms |
| コンパイル使用メモリ | 85,868 KB |
| 実行使用メモリ | 2,047,428 KB |
| 最終ジャッジ日時 | 2026-03-20 21:01:10 |
| 合計ジャッジ時間 | 45,044 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 17 TLE * 10 MLE * 6 -- * 27 |
ソースコード
import sys
MOD = 998244353
def main():
input = sys.stdin.readline
N, P, Q = map(int, input().split())
# dp[p][q]:
# 現在の長さで、総和が (p, q) であり、
# これまでの全ての prefix 条件を満たす列の個数
dp = [[0] * (Q + 1) for _ in range(P + 1)]
dp[0][0] = 1
ans = []
for _ in range(N):
# 2 次元累積和 pref を作る
pref = [[0] * (Q + 1) for _ in range(P + 1)]
for p in range(P + 1):
row_sum = 0
pref_row = pref[p]
dp_row = dp[p]
if p > 0:
pref_prev = pref[p - 1]
for q in range(Q + 1):
row_sum += dp_row[q]
if row_sum >= MOD:
row_sum -= MOD
pref_row[q] = pref_prev[q] + row_sum
if pref_row[q] >= MOD:
pref_row[q] -= MOD
else:
for q in range(Q + 1):
row_sum += dp_row[q]
if row_sum >= MOD:
row_sum -= MOD
pref_row[q] = row_sum
# 次の長さの dp を作る
ndp = [[0] * (Q + 1) for _ in range(P + 1)]
for p in range(P + 1):
# 条件 Q*p >= P*q を満たす q の範囲だけ代入してもよい
for q in range(Q + 1):
if Q * p >= P * q:
# 最後の項 (A_i, B_i) を自由に足す。
# 直前の総和を (x, y) とすると x<=p, y<=q。
# prefix 条件は新しい末尾 prefix だけ見ればよい。
ndp[p][q] = pref[p][q]
dp = ndp
ans.append(dp[P][Q] % MOD)
print(*ans, sep="\n")
if __name__ == "__main__":
main()
potato167