Зворотний відлік#11845

Зворотний відлік (Розбір)

Помітимо, що кількість паличок, яка буде використана, дорівнює кількості разів, коли зустрічається цифра серед чисел від до , помноженій на кількість паличок, необхідну для цієї цифри. Тобто загалом:

\sum_{i=0}^{9} cnt[i]\cdot segment[i],

де segment[i] = \{6, 2, 5, 5, 4, 5, 6, 3, 7, 6\} — кількість сегментів для відповідної цифри.

Остання складність — це обчислити , тобто кількість появ цифри у числах від до . Розглянемо кількість певної цифри на певній позиції, починаючи з найменшого розряду: нехай cnt[i][j] — кількість появ цифри на -му розряді серед чисел від до .

Порахуємо допоміжні значення:

pow = 10^j, \qquad \mathrm{high} = \left\lfloor \frac{n}{10\,pow} \right\rfloor, \qquad \mathrm{current} = \left\lfloor \frac{n}{pow} \right\rfloor \bmod 10, \qquad \mathrm{low} = n \bmod pow.

Тоді для i\neq0 маємо:

cnt[i][j] = \mathrm{high}\times pow + \begin{cases} pow, & \text{якщо }\mathrm{current}>i,\\ \mathrm{low}+1, & \text{якщо }\mathrm{current}=i,\\ 0, & \text{якщо }\mathrm{current}<i. \end{cases}

Для i=0:

cnt[0][j] = \begin{cases} 0, & \text{якщо }\mathrm{high}=0,\\ (\mathrm{high}-1)\times pow, & \text{якщо }\mathrm{high}\geq1, \end{cases} + \begin{cases} pow, & \text{якщо }\mathrm{current}>0,\\ \mathrm{low}+1, & \text{якщо }\mathrm{current}=0,\\ 0, & \text{якщо }\mathrm{current}<0. \end{cases}

Отже, порахувавши всі cnt[i][j], ми можемо обчислити

cnt[i] = \sum_{j=0}^{9} cnt[i][j],

після чого обчислити загальну кількість сегментів.

Загальна часова складність O(10\log_{10}{n}).