EDPC S - Digit Sum

桁和

考え方

ABCでいうと、E問題級。

いわゆる桁 DP。

free[i][r] を、i 桁目より後ろを自由に決めたとき、桁和を $D$ で割った余りが r になる個数とする。
これは、下の桁から順に作れる。

その事前処理をしておいて、上から順に桁を見ていく。
今見ている桁で $K$ の同じ桁より小さい値を置いた瞬間、それより後ろの桁は自由になる。
その自由になった後ろの桁の個数を、先に作った free から取り出せばよい。

具体的には、後ろの桁で必要な余りは $-(s + j) \bmod D$ になる。
ただし、$s$ は今見ている桁より上の桁和、$j$ は今の桁に置く値である。
これに対応する free[i][...] を答えに足していけば、$0$ 以上 $K$ 未満のパターン数になる。

問題は $1$ 以上 $K$ 以下なので、その分の補正を考える。
未満と以下の補正は、最初に $K$ に $1$ を足しておけばよい。
$0$ 以上と $1$ 以上の補正は、$0$ が必ず条件を満たすことから、単純に $-1$ しておけばよい。

計算量は $O(|K|D)$。

入力例1での動作

入力を受け取る。

k: 30
d: 4

$1$ 以上 $30$ 以下を数える代わりに、$0$ 以上 $31$ 未満を数えてから $0$ の分を引く。

まず、下 $1$ 桁を自由に決める場合を考える。
$0$ から $9$ までについて、$4$ で割った余りごとの個数は次のようになる。

余り $0$ $1$ $2$ $3$
個数 $3$ $3$ $2$ $2$

$31$ 未満なので、十の位が $3$ より小さい場合を考える。

十の位が $0$ のとき、一の位の余りは $0$ であればよい。
該当する一の位は $0,4,8$ の $3$ 通りである。

十の位が $1$ のとき、一の位の余りは $3$ であればよい。
該当する一の位は $3,7$ の $2$ 通りである。

十の位が $2$ のとき、一の位の余りは $2$ であればよい。
該当する一の位は $2,6$ の $2$ 通りである。

ここまでで $3+2+2=7$ 通りである。

十の位を $3$ と同じにする場合、$31$ 未満にするには一の位は $0$ しか選べない。
しかし、$3+0$ は $4$ の倍数ではないので追加はない。

したがって、$0$ 以上 $31$ 未満では $7$ 通りである。
ここから $0$ の $1$ 通りを引く。

答えは $7-1=6$ である。

注意点

答えは $10^9+7$ で割った余りを要求されているので、剰余類環の考えに従って処理する。
足し算をするたびに結果を % 1000000007 する。

別解

特になし。