具体例で考える
入力例 2の 5915 は、次のように計算されます。
桁の数は、切れ目を入れられる部分が 個あり、それぞれについて切れ目を入れる/入れないの どちらかになるため、[2^{N-1}] 通りの掛け算の和を求めることになります。 は大きな数になりうる()ので、すべての掛け算を計算して和を求めるのは困難です。
そこで、桁を増やしていく動的計画法で考えていきます。
動的計画法をどのように行うか
下から3桁の 915 は、次のように計算されます。
この前に 5 を加えて4桁にします。5 と 9 の間に切れ目が入るケースは、
からわかるように、3桁の結果に 4桁目の数字の 5をかけた値になります。
残りは5 と 9 の間に切れ目が入らないケースで、整理すると、
となります。下桁の計算結果を と表すと、4桁目の数を として
これを参考にすると、一般項として
と表すことができます。
コード例 (Julia)
function solve() MOD_ = 998244353 # 入力 readInt() = parse(Int,readline()) # 入力データ N = readInt() S = readline() P = 1 dp = parse(Int,S[N]) for i = N-1:-1:1 P = dp + 10 * P P %= MOD_ dp = dp + parse(Int,S[i]) * P dp %= MOD_ end println(dp) end # function solve # main solve()