EDPC M - Candies

飴

考え方

ABCでいうと、E問題級。

一見、子供を $1$ 人ずつ増やしながら、飴の個数ごとの配り方を継承するだけの動的計画法。

しかし、マスの数が最大で $100 \times 10^5 = 10^7$ 個ある。
そして、$1$ つのマスを埋めるのに最大 $10^5$ 個の数を足し算しないといけない。
つまり、愚直にやると TLE する。

ということで、最大 $10^5$ 個の数を足し算しなくて済むように、sliding window 法を使う。
以上……ではあるのだが、$2$ つのアルゴリズムのコードが絡まる都合で、実装がとてもややこしい。

計算量は $O(NK)$。

入力例1での動作

入力を受け取る。

n: 3
k: 4
a: {1, 2, 3}

合計 $0$ 個から $4$ 個までについて、ここまでの子供たちへの配り方の数を考える。

まだ誰にも配っていないときは、合計 $0$ 個だけが $1$ 通りである。

{1, 0, 0, 0, 0}

$1$ 人目には $0$ 個または $1$ 個を渡せる。

{1, 1, 0, 0, 0}

$2$ 人目には $0$ 個以上 $2$ 個以下を渡せる。

例えば合計 $2$ 個にするには、それまでの合計が $2,1,0$ 個の場合が使える。
方法数は $0+1+1=2$ 通りである。

全て求めると、次のようになる。

{1, 2, 2, 1, 0}

$3$ 人目には $0$ 個以上 $3$ 個以下を渡せる。

更新前の、合計 $0$ 個から $4$ 個までの方法数を $1,2,2,1,0$ とする。

合計 $x$ 個にする方法数は、更新前の合計 $x,x-1,x-2,x-3$ 個の方法数の和である。

これを毎回最初から足すと時間がかかるので、重なっている部分を sliding window で使い回す。

例えば合計 $4$ 個について、$3$ 人目に $1$ 個以上 $3$ 個以下を渡す場合の和は $2+2+1=5$ である。
$0$ 個渡す場合の $0$ 通りも加えて、合計 $5$ 通りとなる。

次に合計 $3$ 個を考える。
先ほどの和 $5$ から、合計 $3$ 個の $1$ 通りを外す。
代わりに、合計 $0$ 個の $1$ 通りを加えると $5-1+1=5$ となる。

$0$ 個渡す場合の $1$ 通りも加えるので、合計 $6$ 通りとなる。

同じように窓をずらすと、次のようになる。

配る飴の合計 $0$ 個渡す場合 $1$~$3$ 個渡す場合 更新後
$4$ $0$ $5$ $5$
$3$ $1$ $5$ $6$
$2$ $2$ $3$ $5$
$1$ $2$ $1$ $3$
$0$ $1$ $0$ $1$

更新後は次のようになる。

{1, 3, 5, 6, 5}

飴を合計 $4$ 個配る方法は $5$ 通りである。
したがって、答えは $5$。

注意点

答えは $10^9+7$ で割った余りを要求されているので、剰余類環の考えに従って処理する。
足し算や引き算をするたびに結果を % 1000000007 する。
引き算で負になることがあるので、出力前に負数を補正する。

別解

特になし。