Задание №23 — Поиск количества программ
Исполнитель преобразует число на экране. У исполнителя есть три команды, которые обозначены латинскими буквами:
А. Прибавить 1
В. Прибавить 4
С. Умножить на 2
Программа для исполнителя - это последовательность команд. Сколько существует программ, для которых при исходном числе 3 результатом является число 24, при этом траектория вычислений не содержит числа 11 и не содержит числа 17? Траектория вычислений программы - это последовательность результатов выполнения всех команд программы.
Например, для программы СВА при исходном числе 7 траектория будет состоять из чисел 14, 18, 19.
Правильный ответ
298
Пояснение
Решение:
Все команды только увеличивают число на экране, поэтому траектория строго возрастает и ни одно число не может встретиться в ней дважды.
Пусть — количество программ, переводящих в : (пустая программа), при (число уже «перескочило» цель, а уменьшать команды не умеют). В остальных случаях перебираем первую команду («прибавить 1», «прибавить 4» или «умножить на 2»):
Числа и траектория содержать не должна, поэтому переходы в них запрещаем — соответствующие слагаемые отбрасываем.
from functools import lru_cache
@lru_cache(None)
def f(x, y): # сколько программ переводят число x в число y
if x == y:
return 1
if x > y:
return 0 # перескочили - назад команд нет
s = 0
for z in (x + 1, x + 4, x * 2):
if z not in (11, 17):
s += f(z, y)
return s
print(f(3, 24))
Программа выводит .
Ответ: 298