Исполнитель Увеличитель145 преобразует число, записанное на экране. У исполнителя три команды, которым присвоены номера:
1. Прибавь 1
2. Прибавь 4
3. Прибавь 5
Первая из них увеличивает число на экране на 1, вторая увеличивает это число на 4, а третья — на 5. Программа для исполнителя Увеличитель145 — это последовательность команд. Сколько есть программ, которые число 30 преобразуют в число 46?
Для сложения справедлив переместительный (коммутативный) закон, значит, порядок команд в программе не имеет значения для результата.
Все команды увеличивают исходное число, поэтому количество команд не может превосходить (46 − 30) = 16. При этом минимальное количество команд — 4.
Таким образом, команд может быть 4, 5, 6, ... или 16. Порядок команд не имеет значения, каждому числу команд соответствует один набор команд, которые можно расположить в любом порядке.
Рассмотрим все возможные наборы и вычислим количество вариантов рассположения команд в них.
Набор 11 ... 1111 имеет один возможный вариант.
Набор 11 ... 2 — 13 вариантов.
Набор 221111 1111 — 45 возможных вариантов расположения: это число перестановок с повторениями 10!/(8!·2!).
Набор 222 1111 — 35 вариантов.
Набор 2222 — 1 вариант.
Набор 3331 — 4 варианта.
Набор 33111 111 — 28 вариантов.
Набор 311...11 — 12 вариантов.
Набор 322111 — 60 вариантов.
Набор 32311 — 30 вариантов.
Набор 321111111 — 72 варианта.
Всего имеем: 1 + 13 + 45 + 35 + 1 + 4 + 32 + 12 + 60 + 30 + 72 = 301 программа.
Ответ: 301.
Приведём другое решение на языке Python.
def f(x, y):
if x > y:
return 0
if x == y:
return 1
else:
return f(x + 1, y) + f(x + 4, y) + f(x + 5, y)
print(f(30, 46))

