
Исполнитель U18 преобразует число, записанное на экране. У исполнителя есть три команды, которым
присвоены номера: 1. Вычесть 12. Вычесть 33. Разделить нацело на 3При выполнении команды 3 выполняется деление нацело (остаток отбрасывается). Программа для исполнителя U18 – это последовательность команд. Сколько существует таких программ, которые исходное число 22 преобразуют в число 2?

Ответы на вопрос

Ответ:
2196
Объяснение:
Посчитаем, сколько команд переводят 22 в n, обозначим это количество как a(n). Положим a(22) = 1 (существует одна - пустая - программа, переводящая 22 в 22) и a(n) = 0 для всех n больше 22.
Любое число n могло получиться следующими способами:
- из n + 1 путем вычитания 1
- из n + 3 путем вычитания 3
- из 3n путем деления на 3
- из 3n + 1 путем деления на 3
- из 3n + 2 путем деления на 3
Тогда a(n) = a(n + 1) + a(n + 3) + a(3n) + a(3n + 1) + a(3n + 2).
Начинаем последовательно вычислять значения:
a(21) = a(22) + 0 + 0 + 0 + 0 = 1
a(20) = a(21) + 0 + 0 + 0 + 0 = 1
a(19) = a(20) + a(22) + 0 + 0 + 0 = 2
...
a(7) = a(8) + a(10) + a(21) + a(22) + 0
a(6) = a(7) + a(9) + a(18) + a(19) + a(20)
...
Получившиеся значения приведены в таблице:



Для решения этой задачи можно использовать динамическое программирование. Создадим массив DP, где DP[i] будет обозначать количество способов получить число i с использованием данных команд. Изначально DP[22] будет равно 1 (потому что у нас есть только один способ получить 22 - это оставить его без изменений).
Затем мы начнем итеративно обновлять значения DP[i] для всех чисел от 1 до 22 в порядке возрастания. Для каждого числа i мы будем рассматривать все три команды и добавлять к DP[i] количество способов получить число i, используя каждую из этих команд.
- Для команды "Вычесть 12" мы проверим, можно ли вычесть 12 из числа i (т.е., i >= 12), и если можно, то добавим DP[i - 12] к DP[i].
- Для команды "Вычесть 33" аналогично проверим, можно ли вычесть 33 из числа i (i >= 33), и если можно, то добавим DP[i - 33] к DP[i].
- Для команды "Разделить нацело на 3" мы проверим, делится ли число i нацело на 3 (i % 3 == 0), и если да, то добавим DP[i / 3] к DP[i].
После завершения этой итерации DP[2] будет содержать количество способов получить число 2 из числа 22. Это будет ответ на ваш вопрос.
Вот Python код, который решает эту задачу:
pythondef count_programs(target):
DP = [0] * (target + 1)
DP[22] = 1 # Исходное число 22
for i in range(1, target + 1):
if i >= 12:
DP[i] += DP[i - 12]
if i >= 33:
DP[i] += DP[i - 33]
if i % 3 == 0:
DP[i] += DP[i // 3]
return DP[target]
result = count_programs(2)
print(result)
Этот код выведет количество программ, которые могут преобразовать число 22 в число 2.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili