Задание №23 — Поиск количества программ
Исполнитель преобразует число на экране. У исполнителя есть три команды, которые обозначены латинскими буквами:
А. Прибавить 2
В. Прибавить 3
С. Умножить на 5
Программа для исполнителя - это последовательность команд. Сколько существует программ, для которых при исходном числе 1 результатом является число 31, при этом траектория вычислений не содержит числа 6 и не содержит числа 17? Траектория вычислений программы - это последовательность результатов выполнения всех команд программы.
Например, для программы СВА при исходном числе 7 траектория будет состоять из чисел 35, 38, 40.
Правильный ответ
961
Пояснение
Решение:
Все команды только увеличивают число на экране, поэтому траектория строго возрастает и ни одно число не может встретиться в ней дважды.
Пусть — количество программ, переводящих в : (пустая программа), при (число уже «перескочило» цель, а уменьшать команды не умеют). В остальных случаях перебираем первую команду («прибавить 2», «прибавить 3» или «умножить на 5»):
Числа и траектория содержать не должна, поэтому переходы в них запрещаем — соответствующие слагаемые отбрасываем.
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 + 2, x + 3, x * 5):
if z not in (6, 17):
s += f(z, y)
return s
print(f(1, 31))
Программа выводит .
Ответ: 961