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\).

\[f_c = \begin{cases} left \times r, & current = 0, \\ left \times r + right + 1, & current = 1, \\ (left + 1) \times r, & current \gt 1. \end{cases}\]

那么

\[f(N)=\sum_{c=1}^n{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

posted @ 2020-08-13 21:26  Blind  阅读(108)  评论(0编辑  收藏  举报