ABC253E - Distance Sequence

考え方

配るDPなら区間への遷移.貰うDPなら区間への遷移.

よって,よくある累積和を取りながらのDP.
【類題】

回答例(配るDP & いもす法)

$K=0$の場合に注意.

N, M, K = map(int, input().split())
mod = 998244353

dp = [[0] * (M + 1) for _ in range(N + 1)]
dp[1] = [1] * (M + 1)

for i in range(1, N):
    for j in range(1, M + 1):
        if K == 0:
            dp[i + 1][1] += dp[i][j]
            dp[i + 1][1] %= mod
            continue
        if j + K <= M:
            dp[i + 1][j + K] += dp[i][j]
            dp[i + 1][j + K] %= mod
        if 0 < j - K:
            dp[i + 1][1] += dp[i][j]
            dp[i + 1][1] %= mod
            if j - K + 1 <= M:
                dp[i + 1][j - K + 1] -= dp[i][j]
                dp[i + 1][j - K + 1] %= mod

    for j in range(1, M):
        dp[i + 1][j + 1] += dp[i + 1][j]
        dp[i + 1][j + 1] %= mod

print(sum(dp[-1]) % mod)