ЕГЭ по информатике сдают на компьютере (КЕГЭ). На экзамене доступны среды программирования и электронные таблицы, поэтому многие задания честнее и быстрее решить короткой программой, чем выписывать выкладки на черновике. Хитрость в том, чтобы заранее знать, где код экономит время, а где он только мешает.
Ниже разбор по типам заданий, четыре рабочих примера на Python с ответами и советы, как готовить шаблоны. Ориентир — материалы ФИПИ-2027: 27 заданий, 29 первичных баллов, 235 минут. В №10 теперь сети и маски, в №13 — анализ алгоритма, в №23 — графы. В ответе на №27 записывают два числа в одной строке, как требует условие.
Что выгоднее решать программой
Программа выигрывает там, где нужен перебор, большие числа или обработка файла с тысячами строк. Руками такие задания решаются дольше и с большим риском арифметической ошибки.
| Тип задания | Чем помогает код |
|---|---|
| Таблицы истинности логической функции | перебор всех наборов через itertools.product |
| Алгоритм, который преобразует запись числа (например, двоичную) | прямое моделирование алгоритма для каждого N |
| Комбинаторика слов из заданных букв | перебор всех слов через product или permutations |
| Системы счисления с огромными числами | в Python целые числа любой длины, степени вроде 4²⁰²⁰ считаются мгновенно |
| Логические выражения с отрезками, делителями, поразрядными операциями | перебор параметра A и проверка выражения для всех x |
| Рекурсивные функции | прямой перенос определения в код, sys.setrecursionlimit, functools.lru_cache |
| Обработка последовательности чисел из файла | чтение файла и подсчёт пар, троек, минимумов |
| Теория игр (камни в куче) | рекурсивный перебор позиций вместо таблицы ходов |
| Анализ алгоритма, №13 | трассировка переменных и проверка ветвлений |
| Графы, №23 | обработка связей и поиск по графу с учётом условия |
| Строки из файла | поиск самой длинной подстроки с условием за один проход |
| Поиск чисел по маске и по делителям | перебор кратных и проверка маски через fnmatch |
| Сортировка и выбор из файла | чтение, sort, жадный отбор |
Некоторые задания из этого списка решаются и аналитически. Если вы видите решение в уме за минуту, программа не нужна. Но код даёт второй независимый способ проверить ответ, и это ценно.
Пример 1. Большие числа и двоичная запись
Условие. Сколько единиц в двоичной записи числа 4²⁰²⁰ + 2²⁰¹⁷ − 15?
Pythonn = 4**2020 + 2**2017 - 15
print(bin(n).count("1"))
Ответ: 2015.
Python работает с длинной арифметикой, поэтому число из четырёх тысяч двоичных разрядов для него обычная переменная. Функция bin возвращает строку вида 0b1011, приставка 0b единиц не содержит и на ответ не влияет. Для других оснований пишут свою функцию перевода через divmod в цикле: это одна из заготовок, которую стоит иметь наготове.
Проверка руками здесь тоже возможна: 2²⁰¹⁷ − 15 = (2²⁰¹⁷ − 2⁴) + 1. Разность даёт единицы в разрядах с 4 по 2016, то есть 2013 штук, плюс одна единица от «+1» и одна от 4²⁰²⁰ = 2⁴⁰⁴⁰. Итого 2015. Хорошая привычка: если есть быстрый ручной способ, сравнить его с ответом программы.
Пример 2. Таблица истинности
Условие. Функция F = (x ∨ ¬y) → (z ≡ w). Выведите все наборы переменных, при которых F ложна.
Pythonfrom itertools import product
print("x y z w")
for x, y, z, w in product([0, 1], repeat=4):
f = (x or not y) <= (z == w)
if not f:
print(x, y, z, w)
Ответ: шесть наборов: 0001, 0010, 1001, 1010, 1101, 1110 (в порядке x y z w).
Приём с <= работает потому, что для значений 0 и 1 импликация a → b ложна ровно тогда, когда a = 1 и b = 0, а сравнение a ≤ b ложно в том же единственном случае. Эквивалентность записывается как ==. На экзамене обычно дан фрагмент таблицы с пропусками, и нужно сопоставить столбцы с переменными. Программа печатает полную таблицу, дальше вы сравниваете её с фрагментом глазами или добавляете перебор перестановок столбцов через itertools.permutations.
Пример 3. Маска и делимость
Условие. Найдите все натуральные числа, не превышающие 10⁸, которые соответствуют маске 12*4?6 и делятся на 2023. Символ ? означает ровно одну цифру, * означает любую последовательность цифр, в том числе пустую. Выведите числа по возрастанию и частное от деления на 2023.
Pythonfrom fnmatch import fnmatch
LIMIT = 10**8
for n in range(2023, LIMIT + 1, 2023):
if fnmatch(str(n), "12*4?6"):
print(n, n // 2023)
Ответ: восемь чисел, первое 125426 (частное 62), последнее 12971476 (частное 6412).
Главная идея: перебирать сразу кратные 2023 с шагом 2023, а не все числа подряд. Так цикл делает около 50 тысяч шагов вместо ста миллионов и заканчивается мгновенно. Если перебор всё же выходит большим, программа должна работать не дольше пары минут: проверьте это на тренировке, а не на экзамене.
Пример 4. Пары чисел из файла
Условие. В файле numbers.txt в первой строке записано количество чисел N, затем N целых чисел по одному в строке. Найдите количество пар соседних элементов, в которых ровно одно число делится на 3, а сумма пары нечётна, и максимальную сумму среди таких пар.
Формат файла на небольшом примере:
text7
12
5
9
3
20
6
21
Pythonwith open("numbers.txt") as f:
n = int(f.readline())
nums = [int(f.readline()) for _ in range(n)]
count = 0
best = 0
for a, b in zip(nums, nums[1:]):
if (a % 3 == 0) != (b % 3 == 0) and (a + b) % 2 == 1:
count += 1
best = max(best, a + b)
print(count, best)
Ответ для примера: 2 23 (подходят пары 12 и 5, 3 и 20).
Условие «ровно одно из двух» удобно записывать через != между двумя логическими значениями. Прежде чем запускать программу на экзаменационном файле, прогоните её на маленьком примере, где ответ можно проверить глазами. Если в файле встречаются отрицательные числа, начальное значение максимума 0 уже не подойдёт: берите -10**9 или None с отдельной проверкой.
Что быстрее руками или в таблице
Код полезен не везде. Есть задания, где на написание программы уйдёт больше времени, чем на решение.
- Граф и таблица расстояний, №1. Сопоставить вершины графа со строками таблицы проще по степеням вершин на черновике.
- Кодирование и условие Фано. Дерево префиксного кода рисуется за пару минут.
- Объём информации. Пароли, изображения, звук: это формула и аккуратный подсчёт битов и байтов, программа тут лишняя.
- Задания на готовые данные в электронной таблице. Выборка по условиям, сумма, среднее быстрее делаются фильтром и формулой.
- Сети и маски, №10. Небольшую задачу удобно разобрать через двоичную запись адреса и маски; программу можно использовать для проверки.
Задания с таблицами и файлами иногда удобно решать и таблицей, и кодом. Выбирайте тот инструмент, в котором вы реже ошибаетесь, а второй держите для проверки.
Шаблоны и тренировка на время
Сильнее всего экономят время заготовки, которые вы написали сами и много раз запускали. Держите в голове и в тренировочной папке такие шаблоны:
- Перебор наборов через
productдля логики и комбинаторики слов. - Перевод числа в систему с любым основанием и обратно.
- Рекурсия с кэшем:
@lru_cache(None)над функцией иsys.setrecursionlimit(10**6)в начале, если глубина большая. - Теория игр: рекурсивная функция, которая по позиции и номеру хода говорит, выигрывает ли нужный игрок.
- Работа с графом: чтение рёбер, список смежности, обход и проверка ограничений из условия.
- Чтение файла с числами и со строками.
- Перебор по маске через
fnmatchили через вложенные циклы по пропущенным цифрам.
Совет. Готовьтесь на одном языке. Если вы решаете на Python, не переключайтесь перед экзаменом на другой язык ради одного задания: синтаксис в стрессе путается.
Тренируйтесь с таймером. Засеките, сколько у вас уходит на каждый тип, и выпишите типы, где время больше нормального. Именно их стоит прогнать ещё несколько раз, пока шаблон не будет набираться без подглядывания. Среду, в которой работаете на тренировках, по возможности держите похожей на экзаменационную: та же версия Python и простой редактор без подсказок, к которым вы привыкли дома.
В Курсике это собрано в трек ЕГЭ по информатике: задания проверяются сразу, после ошибки виден разбор и можно решить похожее, а навыки возвращаются на повторение через 1, 3, 7, 14 и 30 дней. Как устроено повторение и зачем писать пробник в строгом режиме, мы разобрали в статье про интервальное повторение и пробник. Общая информация о треке на странице ЕГЭ по информатике.
Коротко
- Код выгоден там, где перебор, большие числа, рекурсия или файл с тысячами строк.
- Небольшой граф в №1 удобно разобрать на черновике; графовую задачу №23 тренируйте отдельно с кодом.
- Каждую программу сначала проверяйте на маленьком примере с известным ответом.
- Шаблоны пишите заранее и тренируйтесь на время, на одном языке.
- В материалах прошлых лет проверяйте тему, а не только номер: позиции №10, №13 и №23 в модели 2027 изменились.