Задание №23 — Поиск количества программ
Исполнитель преобразует число на экране. У исполнителя есть две команды, которые обозначены латинскими буквами:
А) Прибавить 2
В) Прибавить 7
Первая команда увеличивает число на экране на 2, вторая увеличивает это число на 7. Программа для исполнителя — это последовательность команд. Сколько существует программ, которые число 7 преобразуют в число 51?
Правильный ответ
639
Пояснение
Решение:
Команда А увеличивает число на , команда В — на ; порядок команд на итоговое число не влияет, важно лишь, сколько раз использована каждая. Всего надо прибавить . Если команда А использована раз, а команда В — раз, то
Отсюда подходят только (при остальных остаток не делится на нацело или отрицателен).
Программа — это последовательность команд, поэтому при фиксированных и количество программ равно числу способов расставить команд В среди всех команд, то есть .
| — команд В | — команд А | Количество программ |
|---|---|---|
| 0 | 22 | |
| 2 | 15 | |
| 4 | 8 | |
| 6 | 1 |
Складываем: .
Тот же результат даёт короткая программа:
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 + 7):
s += f(z, y)
return s
print(f(7, 51))
Ответ: 639