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\)のいずれか)

したがって、十分高速に答えを求めることができます。

実装例(Python)

posted:
last update: