решай.ai · шпаргалка
Задание 27: Программирование
ЕГЭ Информатика
Как выглядит
Типичная формулировка: дана последовательность чисел или пар чисел (до – элементов), нужно вычислить сумму/произведение/количество пар, удовлетворяющих условию делимости или максимальности при ограничении. Входные данные — два файла: А (маленький, можно решить и перебором) и B (большой, переборный алгоритм не успеет отработать). В ответе указываются два числа — результат для файла А и для файла B, в этом порядке. За задание дают 2 балла: по одному за каждый файл, если программа выдаёт верный ответ и использует принципиально верный (не экспоненциальный) алгоритм. Достаточно пр …
Что нужно знать
- Остаток от деления: — число от до , такое что .
- Делимость: делится на тогда и только тогда, когда .
- Разложение модуля на простые множители — ключ к решению: , .
- Произведение делится на (простые ), если множители и в сумме «набираются» у и : одно число делится на , либо одно делится на , другое — на .
- Число пар внутри одной группы размера : .
- Число пар между двумя разными группами размерами и : .
- Сложность: полный перебор пар — , при это операций (слишком долго); проход с группировкой — или .
- При и элементах до сумма может достигать , произведение — до ; в C++/Pascal нужен 64-битный тип, в Python переполнения нет.
Алгоритм
- Прочитать входные данные: количество элементов и сами значения.
- Определить признак, связанный с условием (остаток от деления или простые множители модуля из условия).
- Завести переменные-агрегаты для каждого кластера (количество, сумма, максимум, топ-несколько значений).
- Один раз пройти по элементам, распределяя каждый в соответствующий кластер и обновляя агрегаты.
- По собранным агрегатам применить формулу задачи (суммирование, , , минимальная коррекция, перебор top-k) — без обращения ко всему массиву.
- Повторить для обоих файлов (маленький можно проверить и перебором) и вывести оба числа в требуемом порядке.
Ловушки
- Полный перебор пар на большом файле — программа не успевает выполниться, балл за файл B теряется.
- Переполнение целочисленного типа: суммы до , произведения до — в C++/Pascal нужен
long long/int64. - Ошибка при определении «дополняющих» кластеров: число, кратное сразу двум множителям модуля, нельзя относить к кластеру «только один из множителей».
- Использование вместо при подсчёте пар внутри одного кластера — результат завышается.
- В задачах на «максимум при ограничении» проверка только одной случайной коррекции вместо поиска минимальной по всем кандидатам.
- Путаница «пара различных элементов» с использованием одного элемента дважды.
- Отсутствие проверки программы на демонстрационном примере из условия перед запуском на большом файле.
reshay.ai/ege/informatika/zadanie-27 — задачи с разборами и тренажёр