Исполнитель преобразует число на экране.
У исполнителя есть три команды, которые обозначены латинскими буквами:
A. Вычти 3
B. Вычти 8
C. Найди целую часть от деления на 2
Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 76 результатом является число 12, и при этом траектория
вычислений содержит число 41 и не содержит 73?
Траектория вычислений программы – это последовательность результатов выполнения всех команд программы.
Например, для программы CBA при исходном числе 29 траектория состоит из чисел 14, 6, 3.
Способ 1 (С рекурсией)
🔹 Шаг 1. Идея решения задачи
📌 Нужно посчитать количество программ, которые:
💡 Поэтому задачу удобно разбить на два этапа:
пути от 76 до 41;
пути от 41 до 12.
И затем перемножить количества программ для этих этапов.
🔹 Шаг 2. Функция подсчёта количества программ
def f(x, y):
if x < y: return 0
if x == 73: return 0
if x == y:
return 1
return f(x - 3, y) + f(x - 8, y) + f(x // 2, y)
print(f(76, 41) * f(41, 12))
📌 Функция f(x, y) считает, сколько программ переводят число x в число y, соблюдая ограничения.
🔹 Шаг 3. Запрещённые и граничные случаи
if x < y: return 0
if x == 73: return 0
📌 Объяснение:
если текущее число меньше целевого, дальнейший путь невозможен.
если в траектории появилось число 73, путь запрещён по условию.
🔹 Шаг 4. Условие успешного завершения
if x == y:
return 1
📌 Если текущее число равно целевому, значит программа успешно завершилась и найден один корректный путь.
🔹 Шаг 5. Переходы по командам исполнителя
return f(x - 3, y) + f(x - 8, y) + f(x // 2, y)
📌 Здесь учитываются все возможные команды исполнителя: A: -3, B: x - 8, C: ÷2 (целая часть). Складываем количество программ для всех вариантов.
🔹 Финальный шаг. Учитываем обязательное число 41
print(f(76, 41) * f(41, 12))
📌 Почему умножаем:
каждую программу 76 → 41 можно продолжить любой программой 41 → 12;
число 41 гарантированно входит в траекторию;
запрещённые значения исключаются на обоих этапах.