F - Integer Division Editorial by ngtkana
\(0 \le i \le N\) に対し、文字列 \(X\) を長さ \(i\) の suffix \(s(i) := X[N - i: N]\) に置き換えたときの答えを \(\mathtt{dp}(i)\) と置くと
\[ \begin{aligned} \mathtt{dp}(0) &= 1 \\ \mathtt{dp}(i) &= \sum _ { 0 \le j \lt i } \mathtt{dp(j)} X[N - i: N - j] \ (0 \lt i \lt N) \end{aligned} \]
が成り立ちます。(先頭のチャンクの長さを \(i - j\) と置いて導出しました。)
さらに \(0 \lt i \lt N\) に対する \(\mathtt{dp}(i) \) は、次のように簡単になります。
\[ \begin{aligned} \mathtt{dp}(i) &= \sum _ { 0 \le j \lt i } \mathtt{dp(j)} \frac { s(i) - s(j) } { 10 ^ j } \\ &= s(i) \sum _ { 0 \le j \lt i } \mathtt{dp(j)} 10 ^ { -j } - \sum _ { 0 \le j \lt i } \mathtt{dp(j)} s(j) 10 ^ { -j } \end{aligned} \]
従って、\(\mathtt{dp}(i)\) と一緒に次のものも計算することで、\(O(N)\) 時間になります。
- \(10 ^ { -i }\)
- \(s(i)\)
- \(\sum _ { 0 \le j \lt i } \mathtt{dp(j)} 10 ^ { -j } \)
- \(\sum _ { 0 \le j \lt i } \mathtt{dp(j)} s(j) 10 ^ { -j } \)
posted:
last update: