Задание №23 — Поиск количества программ
Исполнитель преобразует число, записанное на экране. У исполнителя есть три команды, которые обозначены латинскими буквами:
A) Прибавить 1
B) Прибавить 2
C) Умножить на 2
Программа для исполнителя – это последовательность команд.
Сколько существует программ, которые преобразуют исходное число 4 в число 15, и при этом траектория вычислений программы содержит числа 11 и 13?Траектория должна содержать оба указанных числа. Траектория вычислений программы – это последовательность результатов выполнения всех команд программы.
Например, для программы ACB при исходном числе 7 траектория будет состоять из чисел 8, 16, 18.
Правильный ответ
100
Пояснение
Решение:
Из числа исполнитель попадает в (A), (B) или (C). Пусть — количество программ, переводящих в заданное конечное число. Тогда , а , если больше конечного числа (числа только растут, поэтому «перепрыгнув» цель, вернуться нельзя).
Траектория обязана содержать и 11, и 13, а , значит программа распадается на три независимые части: , , . Ответ — произведение.
1) Из 4 в 11. Удвоение полезно только из (даёт 10):
| 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | |
| 1 | 1 | 2 | 3 | 5 | 8 | 14 | 25 |
Например, , , .
2) Из 11 в 13. Удвоение даёт 22 — перелёт, поэтому и (это программы AA и B).
3) Из 13 в 15. Аналогично (программы AA и B).
Итого .
from functools import lru_cache
def count(start, finish):
@lru_cache(None)
def R(x):
if x > finish:
return 0
if x == finish:
return 1
return R(x + 1) + R(x + 2) + R(2 * x)
return R(start)
print(count(4, 11) * count(11, 13) * count(13, 15))
Ответ: 100