1049 Counting Ones (30分)
这道题有点抽象, 先举几个栗子🌰, 找一下规律. (太长不看)
记从\(1\)到\(N\)中\(1\)出现的次数为\(f(N)\), 个位上的数为\(a\), 十位上的数为\(b\), 百位上的数为\(c\), 以此类推.
-
当\(N\)为1位数时
设\(N=6\), 则\(S=\{1\}, f(N)=1\).
此时总结可得:
\[f(N)=\begin{cases} 0, & N=0, \\ 1, & N \geq 1. \end{cases}\] -
当\(N\)为2位数时
\(N\) 个位出现\(1\) 的次数 十位出现\(1\)的次数 \(f(N)\) 10 1 1 2 30 3 10 13 50 5 10 15 11 2 2 4 51 6 10 16 16 2 7 9 此时我们发现, 个位数出现\(1\)的次数\(f_a(N)\)与\(a\)和\(b\)都有关:
\[f_a(N) = \begin{cases} b, & a=0, \\ b+1, & a \geq 1. \end{cases}\]十位数出现\(1\)的次数\(f_b(N)\)也与\(a\)和\(b\)都有关:
\[f_b(N) = \begin{cases} a+1, & b=1, \\ 10, & b \gt 1. \end{cases}\] -
当\(N\)为3位数时
\(N\) 个位出现\(1\) 的次数 十位出现\(1\)的次数 百位出现\(1\)的次数 \(f(N)\) 105 11 10 6 27 110 11 11 11 33 271 28 30 100 158 206 21 20 100 141 210 21 21 100 142 361 37 40 100 177 307 31 30 100 161 310 31 31 100 162 351 36 40 100 176
总结
记\(N\)的当前位\(c\)上的数字为\(current\), \(current\)右边的数字构成的数为\(right\), 左边的数字构成的数为\(left\). 记位权为\(r\), \(c\)位出现\(1\)的数构成的集合为\(S_c\), 出现\(1\)的次数为\(f_c\).
则
那么
以\(N=30915\)为例.
-
当\(c=1\)时, \(current=5(\gt 1), right=0, left=3091, r=10^0=1\).
在\(1 \to N\)中, 仅在\(0 \to left\)的过程中, \(c\)位会取到\(1\), 即\(S_1=\{00001, 00011, 00021, ..., 30911\}, f_1=(left+1) \times r = 3092\).
-
当\(c=2\)时, \(current=1, right=5, left=309, r=10^1=10\).
-
在\(0 \to left-1\)的过程中, 对任意的低位数, \(c\)位会取到\(1\), 即\(S_{2_1}=\{0001X, 0011X, 0021X, ..., 3081X\}, f_{2_1}=left \times r = 3090\)
-
当高位为\(left\)时, 计算\(30910 \to N\)的过程中\(c\)位会取到\(1\)的个数, 即\(S_{2_2}=\{30910, 30911, ..., 30915\}, f_{2_2}=1+right=6\).
则\(f_2=f_{2_1}+f_{2_2}=3096\).
-
-
当\(c=3\)时, \(current=9(\gt 1), right=15, left=30, r=10^2=100\).
在\(1 \to N\)中, 在\(0 \to left\)的过程中, 对任意的低位数, \(c\)位会取到\(1\), 即\(S_3=\{001XX, 011XX, 021XX, ..., 301XX\}, f_3=(left+1) \times r=3100\).
-
当\(c=4\)时, \(current=0, right=915, left=3, r=10^3=1000\).
在\(1 \to N\)中, 在\(0 \to left-1\)的过程中, 对任意的低位数, \(c\)位会取到\(1\), 即\(S_4=\{01XXX, 11XXX, 21XXX\}, f_3=left \times r = 3000\).
-
当\(c=5\)时, \(current=3(\gt 1), right=915, left=0, r=10^4=10000\).
在\(1 \to N\)中, 对任意的低位数, \(c\)位会取到\(1\), 即\(S_5=\{1XXXX\}, f_5=(left+1) \times r=10000\).
综上所述, \(f(N)=\sum_{c=1}^5{f_c}=22288\).
👉 code