Задание №23 — Поиск количества программ
Исполнитель преобразует число на экране. У исполнителя есть три команды, которые обозначены латинскими буквами:
А. Прибавить 1
В. Прибавить 4
С. Умножить на 2
Программа для исполнителя - это последовательность команд. Сколько существует программ, для которых при исходном числе 4 результатом является число 28, при этом траектория вычислений содержит число 11 и не содержит числа 18? Траектория вычислений программы - это последовательность результатов выполнения всех команд программы.
Например, для программы СВА при исходном числе 7 траектория будет состоять из чисел 14, 18, 19,
Правильный ответ
483
Пояснение
Решение:
Все команды только увеличивают число на экране, поэтому траектория строго возрастает и ни одно число не может встретиться в ней дважды.
Траектория обязана содержать число , поэтому каждая подходящая программа однозначно распадается на две части: и . По правилу умножения ответ равен произведению количеств программ для этих участков.
Пусть — количество программ, переводящих в : (пустая программа), при (число уже «перескочило» цель, а уменьшать команды не умеют). В остальных случаях перебираем первую команду («прибавить 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 != 18:
s += f(z, y)
return s
print(f(4, 11) * f(11, 28))
Получаем и , то есть всего программ.
Ответ: 483