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