C - Snake Numbers Editorial
by
Rssll_Krkgrd
以下では\(10\)未満の正整数もすべてヘビ数であるとして考えます。
\(g(n,k)\)を「\(n\)以下の正整数のうち、ヘビ数であり、かつ先頭の桁の数字が\(k\)より真に大きいものの個数」とします。すると、求める答えは\(g(R,0)-g(L-1,0)\)となります。
ここで、\(1\)の位で場合分けをすると、
\(\begin{aligned}g(n,k)=\sum_{i=0}^9g\left(\left\lfloor\frac{n-i}{10}\right\rfloor,\max(k,i)\right)+\max(\min(n,9)-k,0)\end{aligned}\)
が成り立ちます。
(右辺の第\(1\)項はヘビ数が\(2\)桁以上の場合に対応し、第\(2\)項はヘビ数が\(1\)桁の場合に対応しています。)
また、\(n\leq0\)のときは\(g(n,k)=0\)となります。
あとはこの漸化式に従って再帰的に\(g(R,0),f(L-1,0)\)の値を求めればよいです。
ここで、一般に正整数\(N\)について、\(g(N,k)\)を求める際に呼び出される\(g(n,l)\)の\(n\)として出てくるのは、\(N\)の左から何桁かだけを見た数か、もしくはそれから\(1\)引いた数のみです。
(例:\(N=4025\)のとき、\(n\)として出てくるのは\(4025,402,401,40,39,4,3,0,-1\)のいずれか)
したがって、十分高速に答えを求めることができます。
posted:
last update: