2303.py

Исполнитель преобразует число на экране с помощью трёх команд, которым присвоены буквы латинского алфавита: A. Вычесть 5 B. Сделать кратным трём C. Поделить на 3 Команда A уменьшает число на экране на 5. Команда B может быть применена только к числам, не кратным трём, и уменьшает число на экране так, чтобы получилось ближайшее к исходному кратное трём число. Команда C может быть применена только к числам, кратным трём, и уменьшает число на экране в три раза. Программа для исполнителя — это последовательность команд. Сколько программ преобразуют число 103 в число 24, и при этом их траектория вычислений содержит число 73? Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы ACB при исходном числе 251 траектория состоит из чисел 246, 82, 81.
"""
Исполнитель преобразует число на экране с помощью трёх команд, которым присвоены буквы латинского алфавита:

A. Вычесть 5
B. Сделать кратным трём
C. Поделить на 3

Команда A уменьшает число на экране на 5.
Команда B может быть применена только к числам, не кратным трём, и уменьшает число на экране так, чтобы получилось ближайшее к исходному кратное трём число.
Команда C может быть применена только к числам, кратным трём, и уменьшает число на экране в три раза.

Программа для исполнителя — это последовательность команд.

Сколько программ преобразуют число 103 в число 24, и при этом их траектория вычислений содержит число 73?

Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы ACB при исходном числе 251 траектория состоит из чисел 246, 82, 81.
"""

# Проверка по примеру: программа ACB, исходное 251
# A (–5):              251 - 5 = 246  (246 кратно 3: 246 % 3 == 0)
# C (/ 3):             246 / 3 = 82   (82 не кратно 3: 82 % 3 == 1)
# B (ближайшее ↓ кт.3): 82 - 1 = 81  →  траектория [246, 82, 81] ✓

# Тип 2: траектория ДОЛЖНА содержать 73 (обязательный узел)
# Разбиваем путь: 103 → 73 → 24
# Направление: число уменьшается → провал при x < y.
# Команда B: только если x % 3 != 0; результат x - (x % 3)
# Команда C: только если x % 3 == 0; результат x // 3

from functools import lru_cache

@lru_cache(maxsize=None)
def F(s, end):
    if s == end: return 1
    if s < end:  return 0
    result = F(s - 5, end)                   # A: всегда применима
    if s % 3 != 0:                         # B: только если s не кратно 3
        result += F(s - s % 3, end)
    if s % 3 == 0:                         # C: только если s кратно 3
        result += F(s // 3, end)
    return result

print(F(103, 73) * F(73, 24))
"""
Исполнитель преобразует число на экране с помощью трёх команд, которым присвоены буквы латинского алфавита:

A. Вычесть 5
B. Сделать кратным трём
C. Поделить на 3

Команда A уменьшает число на экране на 5.
Команда B может быть применена только к числам, не кратным трём, и уменьшает число на экране так, чтобы получилось ближайшее к исходному кратное трём число.
Команда C может быть применена только к числам, кратным трём, и уменьшает число на экране в три раза.

Программа для исполнителя — это последовательность команд.

Сколько программ преобразуют число 103 в число 24, и при этом их траектория вычислений содержит число 73?

Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы ACB при исходном числе 251 траектория состоит из чисел 246, 82, 81.
"""

# Проверка по примеру: программа ACB, исходное 251
# A (–5):              251 - 5 = 246  (246 кратно 3: 246 % 3 == 0)
# C (/ 3):             246 / 3 = 82   (82 не кратно 3: 82 % 3 == 1)
# B (ближайшее ↓ кт.3): 82 - 1 = 81  →  траектория [246, 82, 81] ✓

# Тип 2: траектория ДОЛЖНА содержать 73 (обязательный узел)
# Разбиваем путь: 103 → 73 → 24
# Направление: число уменьшается → провал при x < y.
# Команда B: только если x % 3 != 0; результат x - (x % 3)
# Команда C: только если x % 3 == 0; результат x // 3

from functools import lru_cache

@lru_cache(maxsize=None)
def F(s, end):
    if s == end: return 1
    if s < end:  return 0
    result = F(s - 5, end)                   # A: всегда применима
    if s % 3 != 0:                         # B: только если s не кратно 3
        result += F(s - s % 3, end)
    if s % 3 == 0:                         # C: только если s кратно 3
        result += F(s // 3, end)
    return result

print(F(103, 73) * F(73, 24))

Репозиторий на GitHub