Official

C - 部活動の選択 / Choosing a Club Activity Editorial by sounansya


動的計画法を考えます。

\(d[i][v]\) を「\(i\) 番目の部活動まで考えた時に、活動ポイントを \(K\) で割ったあまりが \(v\) であるような選び方を \(10^9+7\) で割ったあまり」とします。

遷移は \(d[i][v]=d[i-1][v] + d[i-1][(v-A_i)\bmod K]\) となります。

\(1\) つも部活動を選ばない操作は許されないので、答えは \(d[N][0]-1\)\(10^9+7\) で割ったあまりとなります。

実装例(Python3)

n, k = map(int, input().split())
MOD = 10**9 + 7
d = [0] * k
d[0] = 1
for v in list(map(int, input().split())):
    v %= k
    dd = d.copy()
    for i in range(k):
        d[(i + v) % k] += dd[i]
        d[(i + v) % k] %= MOD
print((d[0] - 1) % MOD)

posted:
last update: