Алгоритм получает на вход натуральное число N и строит по нему новое число R следующим образом:
1. Строится двоичная запись числа N.
2. В конец двоичной записи добавляется двоичный код остатка от деления числа N
3. Результатом работы алгоритма становится десятичная запись полученного числа R.
Пример 1. Дано число N = 13. Алгоритм работает следующим образом.
1. Строим двоичную запись: 1310 = 11012.
2. Остаток от деления 13 на 4 равен 1, добавляем к двоичной записи цифру 1, получаем 110112 = 2710.
3. Результат работы алгоритма R = 27.
Пример 2. Дано число N = 14. Алгоритм работает следующим образом.
1. Строим двоичную запись: 1410 = 11102.
2. Остаток от деления 14
3. Результат работы алгоритма R = 58.
Назовём доступными числа, которые могут получиться в результате работы этого алгоритма. Например,
Возможные остатки от деления числа
Рассмотрим какие цифры будут на конце чисел, при делении
Остаток 0 при делении
Остаток 1 при делении
Остаток 2 при делении
Остаток 3 при делении
Посчитаем доступные числа.
Приведём решение на языке Python.
count = 0
for x in range(1_100_000_000, 1_987_653_210+1):
if x%16 in [10,15] or x%8 in [0,3]:
count += 1
print(count)
Ответ: 332869954.
Приведём решение Юрия Красильникова на языке Python.
Результат алгоритма - это число, двоичная запись которого оканчивается на 000, 011, 1010 или 1111. Такие числа можно представить выражениями 8k, 8k+3, 16k+10 и 16k+15 (к - целое).
Количество целых чисел, задаваемых формулой ak+b, на отрезке [d,u] можно найти по формуле (u-b)//a-(d-b-1)//a.
(1987653210-0)//8-(1100000000-0-1)//8=110956652
(1987653210-3)//8-(1100000000-3-1)//8=110956651
(1987653210-10)//16-(1100000000-10-1)//16=55478326
(1987653210-15)//16-(1100000000-15-1)//16=55478325
110956652+110956651+55478326+55478325=332869954
Эти вычисления проще выполнить с помощью следующей программы:
d,u = 1100000000,1987653210
m=0
for a,b in ((8,0),(8,3),(16,10),(16,15)):
m += (u-b)//a-(d-b-1)//a
print(m)

