Задание 23 ЕГЭ по информатике: подсчёт программ исполнителя с условиями
Подтемы
- Количество программ с обязательным этапом30 задач
- Количество программ с избегаемым этапом15 задач
- Количество программ с обязательным и избегаемым этапами26 задач
- Поиск количества программ по заданному числу24 задач
Что проверяет задание
Задание 23 проверяет умение работать с формальным исполнителем: набором пронумерованных команд, каждая из которых меняет число на экране по строгому правилу (прибавить, умножить, разделить и т.п.). Нужно посчитать, сколько существует программ — последовательностей команд, — которые переводят одно число в другое, причём траектория вычислений (все промежуточные результаты) обязана либо содержать, либо не содержать определённое число.
Задание проверяет не столько знание программирования, сколько умение выстроить рекуррентный подсчёт вариантов без полного перебора: понимание принципа умножения комбинаторики, работу с динамическим программированием "на бумаге" и аккуратность в построении таблиц количества путей.
Как выглядит формулировка и сколько баллов
Типичная формулировка: "Исполнитель преобразует число на экране. У исполнителя есть команды с номерами 1, 2, 3... Программа — последовательность команд. Сколько существует программ, которые переводят число в число , при этом траектория вычислений содержит (не содержит) число ?"
Задание находится в части с кратким ответом, требует записать одно целое число — количество программ. Оценивается в 2 балла. Отдельного текста программы или кода писать не нужно — задача решается вычислениями и логикой на черновике. Сложность обычно средняя-высокая, так как требует точного построения таблицы значений без ошибок в диапазонах.
Что нужно знать
- Исполнитель — объект с фиксированным набором команд; каждая команда — функция, однозначно преобразующая число.
- Программа — конечная последовательность номеров команд, применяемых по порядку.
- Траектория вычислений — последовательность чисел, полученных после каждой команды (исходное число в неё не входит, конечное — входит).
- Принцип умножения: если путь состоит из двух независимых участков, реализуемых и способами, общее число программ равно .
- Рекуррентная формула количества программ, приводящих число к числу через набор команд с приростами (или деление для обратной операции умножения): где , а , если значение недостижимо (меньше или не получается ни одной командой).
- Правило обязательного этапа: если траектория обязана содержать число , то
- Правило избегаемого этапа: чтобы запретить прохождение через , при построении таблицы полагают независимо от того, что дала бы формула, — тогда все более дальние значения автоматически не учитывают пути через .
Методы решения
1. Метод таблицы количества путей (динамическое программирование). Строится таблица от начального числа до целевого, каждое значение — сумма количества путей во "предыдущие" числа по всем командам. Мини-пример: команды +1 и +2, старт 1, цель 4. , , , . Ответ: 3 программы.
2. Метод обязательного промежуточного значения. Траекторию разбивают на два участка: от старта до обязательного числа и от до цели, считают отдельные таблицы и умножают результаты. Мини-пример: те же команды, старт 1, цель 4, обязательно число 3. Путей 1→3: 2 (посчитано выше). Путей 3→4: только +1, то есть 1 путь. Итог: .
3. Метод запрета (избегаемый этап). В таблице значение запрещённого числа искусственно приравнивают к нулю, даже если оно естественно достижимо. Мини-пример: команды +1, +2, старт 1, цель 4, избегаем число 2. , (запрет), , . Ответ: 1 программа.
4. Комбинированный метод (обязательный плюс избегаемый этап). Траекторию делят по обязательным точкам на участки, и в каждом участке отдельно проверяют, попадает ли туда запрещённое число; если да — применяют запрет именно в этом участке. Мини-пример: команды +1, +2, старт 1, цель 5, обязательно число 3, избегаем число 2. Участок 1→3 с запретом 2: . Участок 3→5 (запрет 2 уже не влияет, так как 2<3): . Итог: .
5. Метод дерева перебора. Применяется при очень коротких программах (2–4 команды) как способ проверки: строится дерево всех вариантов вручную, ветви отбрасываются, если не выполняется условие. Удобен для контроля правильности таблицы, но неэффективен при длинных программах.
Алгоритм решения по шагам
- Выписать все команды и числовые операции, которые они выполняют.
- Определить исходное число и целевое ; убедиться, что команды монотонны (только увеличивают или только уменьшают число) — это гарантирует, что таблицу можно строить по возрастанию (или убыванию) без циклов.
- Если есть обязательное число : разбить задачу на две части — от до и от до . Построить таблицу для каждой части отдельно, начиная считать заново с единицы на старте своего участка.
- Если есть избегаемое число : строить единую таблицу от до , но на каждом шаге, когда таблица "доходит" до значения , принудительно поставить и продолжать расчёт дальше как обычно.
- Если условия сочетаются (обязательное и избегаемое): сначала разбить по обязательным точкам, затем в каждом участке проверить, входит ли туда запрещённое число, и применить запрет только там, где нужно.
- Перемножить или сложить полученные значения по правилу, соответствующему структуре задачи (независимые последовательные участки — умножение).
- Проверить результат на разумность: он должен быть целым положительным числом, и порядок величины должен соответствовать длине программы и количеству команд (слишком большие или нулевые ответы — сигнал перепроверить таблицу).
Разбор примеров
Пример 1. Команды: 1) +1, 2) +2, 3) умножить на 2. Исходное число 3, результат 12, траектория обязательно содержит 10.
Шаг 1. Считаем — количество программ от 3 до , используя обратные переходы: , , а также , если чётное.
; ; ; (учли деление ); ; ; ; .
Шаг 2. Считаем — количество программ от 10 (обязательного числа) до 12: ; ; (деление невозможно, так как ).
Шаг 3. Умножаем: . Ответ совпадает с эталонным: 60.
Пример 2. Команды: 1) +1, 2) +3. Исходное число 1, результат 17, траектория обязательно содержит 9.
Шаг 1. Считаем от 1 до 9: , , , , , , , , .
Шаг 2. Считаем от 9 до 17: , , , , , , , , .
Шаг 3. Умножаем: . Совпадает с эталонным ответом.
Пример 3. Команды: 1) +1, 2) +2, 3) +4. Исходное число 1, результат 15, траектория обязательно содержит 8.
Шаг 1. Считаем от 1 до 8: , , , , , , , .
Шаг 2. Считаем от 8 до 15: , , , , , , , .
Шаг 3. Умножаем: . Совпадает с эталонным ответом.
Все три примера показывают одну и ту же логику: разбить путь на два участка через обязательную точку, построить для каждого свою таблицу с единицей на старте участка и нулями для недостижимых значений, затем перемножить итоговые числа.
Типичные ошибки и ловушки
- Забывают, что исходное число не входит в траекторию, а конечное — входит; это меняет, какие значения нужно "закрывать" запретом.
- При обязательном этапе начинают вторую таблицу не с единицы на самом числе , а продолжают первую таблицу — это даёт неверный результат, так как вторая часть пути должна считаться как отдельная задача с новым стартом.
- При работе с командой умножения/деления забывают проверить, что частное целое и не меньше стартового значения — иначе в таблицу попадают несуществующие переходы.
- При избегаемом этапе вычитают количество "плохих" путей из общего числа вместо того, чтобы просто обнулить значение в таблице на нужном шаге — это приводит к двойному учёту или потере части путей.
- В комбинированных задачах забывают проверить, попадает ли запрещённое число в каждый из участков между обязательными точками, и применяют запрет во всех участках сразу или ни в одном.
- Путают понятие "траектория содержит число" с "число получено на конкретном шаге" — важно, что число могло появиться на любом шаге, а не строго на определённом месте программы.
- Допускают арифметические ошибки при последовательном сложении в таблице — рекомендуется проверять промежуточные суммы хотя бы раз повторным подсчётом.
Как готовиться
- Тренироваться строить таблицы количества путей вручную для разных наборов команд: только сложение, сложение и умножение, сложение и вычитание.
- Разобрать отдельно случаи с обязательным этапом, с избегаемым этапом и с их сочетанием — на 3–5 задачах каждого типа, чтобы автоматизировать разбиение на участки.
- Для команд умножения/деления обязательно проверять на каждом шаге целочисленность и допустимый диапазон обратного перехода.
- Для коротких программ (до 3–4 шагов) периодически проверять результат построением дерева вариантов — это помогает находить ошибки в таблице.
- Замечать закономерность: если команды — только +1 и +k, количество путей от до подчиняется рекуррентности, похожей на числа Фибоначчи или на подсчёт способов замостить отрезок плитками длины 1 и ; узнавание такого шаблона ускоряет решение.
- Отрабатывать скорость: цель — решать подобные задачи за 5–7 минут, используя таблицу, а не полный перебор.
- После решения всегда делать быструю проверку правдоподобия ответа: сравнить порядок величины с количеством возможных программ данной длины, чтобы отсеять грубые арифметические ошибки.
Частые вопросы
Что такое траектория вычислений в задании 23?
Это последовательность чисел, полученных после выполнения каждой команды программы по порядку. Исходное число в неё не входит, а результат последней команды входит обязательно.
Как считать количество программ с обязательным промежуточным числом?
Нужно разбить путь на два участка: от старта до обязательного числа и от него до цели, посчитать количество программ для каждого участка отдельно и перемножить результаты.
Как учитывать запрещённое (избегаемое) число в расчётах?
При построении таблицы количества путей значение для запрещённого числа принудительно приравнивают к нулю, независимо от того, что дала бы обычная формула, и продолжают расчёт дальше как обычно.
Что делать, если в задаче есть и обязательное, и избегаемое число?
Сначала разбить путь по обязательным точкам на отдельные участки, затем в каждом участке проверить, попадает ли туда запрещённое число, и применить запрет только там, где это нужно.
Почему при командах умножения нужно быть особенно внимательным?
Потому что обратный переход требует деления, а оно должно давать целое число и результат не меньше стартового значения, иначе такой переход в таблице не существует.
Можно ли решать задание 23 полным перебором вариантов?
Для очень коротких программ (2–4 команды) это возможно и полезно для проверки, но в общем случае перебор слишком долгий, поэтому основным методом остаётся таблица количества путей.
Сколько баллов дают за задание 23 и в каком формате ответ?
Задание оценивается в 2 балла, ответ — одно целое число, обозначающее количество программ, удовлетворяющих условию.