Динамика: количество программ исполнителя
Задание 23 · Билет 1 · ЕГЭ по информатике
Условие
Исполнитель преобразует число на экране. У исполнителя есть три команды, которые обозначены латинскими буквами:
- A. Вычесть 1
- B. Вычесть 4
- C. Найти целую часть от деления на 3
Программа для исполнителя — это последовательность команд.
Траектория вычислений программы — это последовательность результатов выполнения всех команд программы. Например, для программы СBА при исходном числе 22 траектория состоит из чисел 7, 3, 2.
Попробуйте программой
Необязательно, но удобно: напишите здесь свой код на Python, который найдёт ответ. Если не получится — откройте решение и вставьте готовую программу одной кнопкой.
Решите программой на Python
в браузереНапишите свой код, который найдёт ответ, и нажмите «Выполнить». Горячая клавиша запуска: Ctrl/⌘ + Enter.
Разбор задачи
Задание 23 ЕГЭ по информатике — динамика: есть исполнитель с несколькими командами, которые меняют число, и нужно посчитать, сколько существует программ, переводящих стартовое число в конечное. Иногда часть чисел на траектории запрещена, а какое-то обязательно должно встретиться.
Программ может быть очень много, поэтому их не перебирают вручную, а считают динамикой: число способов добраться до цели из данного числа равно сумме способов из всех чисел, откуда в него ведёт одна команда.
Что важно знать
- Задание повышенного уровня — оценивается в 1 балл
- Ответ — одно целое число: количество подходящих программ
- Команды увеличивают или уменьшают число, поэтому счёт ведут от цели к старту либо наоборот
План решения
- Перепишите команды исполнителя и определите, увеличивают они число или уменьшают.
- Отметьте ограничения: какие числа запрещены, какое число обязательно на траектории.
- Заведите — число программ, ведущих из к цели; запишите формулу перехода по командам.
- Считайте значения от цели к старту (или наоборот) и подставляйте их в формулу.
- Если есть обязательное число, перемножьте число путей на двух участках траектории.
Потренируйся считать программы: тренажёр соберёт нового исполнителя с командами и ограничениями, а вы посчитаете ответ программой на Python.
Решение
Теория с нуля: что нужно знать
Решение
открыто шагов: 5 из 5Способ 1 · рекурсия с запоминанием
# Считаем динамикой «с конца»: f(x, goal) — число программ,
# переводящих x в goal и не проходящих через запрещённое число 7.
from functools import lru_cache
BAN = 7 # это число на траектории запрещено
@lru_cache(None) # запоминаем уже посчитанные значения
def f(x, goal):
if x == goal: # цель достигнута — это одна программа
return 1
if x < goal or x == BAN: # ниже цели или запрет — программ нет
return 0
# команды: A — вычесть 1, B — вычесть 4, C — взять целую часть от деления на 3
return f(x - 1, goal) + f(x - 4, goal) + f(x // 3, goal)
# Обязательное число 13 делит путь на два участка: 19→13 и 13→2.
print(f(19, 13) * f(13, 2)) Способ 2 · обход чисел от старта вниз
# ways[x] — число программ, ведущих из старта a в число x.
# Все команды уменьшают число, поэтому идём от старта вниз.
BAN = 7
def count(a, b):
ways = {a: 1} # из a в a ведёт одна (пустая) программа
for x in range(a, b - 1, -1): # от старта к цели по убыванию
if x == BAN or x not in ways:
continue # запрещённое число пропускаем
for y in (x - 1, x - 4, x // 3):
if y >= b: # ниже цели уходить нельзя
ways[y] = ways.get(y, 0) + ways[x]
return ways.get(b, 0) # сколько путей дошло до цели
# Обязательное 13: пути через него = (19→13) × (13→2).
print(count(19, 13) * count(13, 2)) Проверка
Типовые ошибки и проверка
- Путают направление: считают от 19 к 2, а не наоборот.
- Забывают, что C — это целая часть от деления на 3 (деление с округлением вниз), а не остаток.
- Не вычитают пути, проходящие через запрещённое число 7.
- Считают «обязательное 13» как просто «встретилось где-то», не связывая с разбиением пути на две части.
- Проверка: пересчитайте коротким перебором (все программы конечны) и сверьте с динамикой.
Режимы
Сейчас открыт режим обучения: теория, разбор и ответ видны. Скоро появится режим проверки — только условие и поле ответа, без подсказок.
Практикум Все задания Режим проверки — скоро