ABC178-Dを解いた

問題へのリンク

考察したこと

累積和dp?だと思った まずSが2000以下というのが怪しいし、$2000/3 = 666.666…$なので、あとは、うまいこと遷移させればいいと思った 累積和のi-3の値を貰って、modを取れば遷移はOK あとは、dp配列のインデックスがSの所の総和をMOD取った値を出力すればOK

普通に一次元配列で解く解法もあるみたいだけど、二次元配列で解いた

ACコード

ライブラリは抜粋してあります ライブラリ全文

S = ii()
MOD = 10**9 + 7
dp = create_array2(701, S + 1, 0)
dp[0][0] = 1

for i in range(700):
    acc = list(accumulate(dp[i]))

    for k in range(3, len(dp[0])):
        dp[i + 1][k] += acc[k - 3]
        dp[i + 1][k] %= MOD

ans = 0

for i in range(len(dp)):
    ans += dp[i][S]
    ans %= MOD

print(ans)
Hugo で構築されています。
テーマ StackJimmy によって設計されています。