結果
| 問題 |
No.2791 Beginner Contest
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-24 17:50:25 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 947 bytes |
| コンパイル時間 | 361 ms |
| コンパイル使用メモリ | 82,216 KB |
| 実行使用メモリ | 56,804 KB |
| 最終ジャッジ日時 | 2025-08-24 17:50:28 |
| 合計ジャッジ時間 | 2,862 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | WA * 17 |
ソースコード
# DFS + メモ化で O(N) で解く版
from functools import lru_cache
MOD = 998244353
def count_ways(N: int, K: int) -> int:
"""
f(i): ちょうど i に到達して終わる通り数(i>=0)
S(x): f(0)+...+f(x) の累積和(x>=0)
目的: 答え = S(N) (どこで終わっても良い総数)
ただし f(0)=1, f(1..K-1)=0, f(i)=S(i-K) (i>=K)
"""
@lru_cache(maxsize=None)
def f(i: int) -> int:
if i == 0:
return 1
if i < 0:
return 0
if i < K:
return 0
# 漸化式: f(i) = S(i-K)
return S(i - K) % MOD
@lru_cache(maxsize=None)
def S(x: int) -> int:
if x < 0:
return 0
# 累積和: S(x) = S(x-1) + f(x)
return (S(x - 1) + f(x)) % MOD
return S(N) % MOD
# --- 使い方例 ---
if __name__ == "__main__":
N, K = 10, 3
print(count_ways(N, K)) # 例: 出力(法 998244353)