решай.ai · шпаргалка

Задание 27: Программирование

ЕГЭ Информатика

Как выглядит

Типичная формулировка: дана последовательность чисел или пар чисел (до 6⋅1046\cdot10^4–10510^5 элементов), нужно вычислить сумму/произведение/количество пар, удовлетворяющих условию делимости или максимальности при ограничении. Входные данные — два файла: А (маленький, можно решить и перебором) и B (большой, переборный алгоритм не успеет отработать). В ответе указываются два числа — результат для файла А и для файла B, в этом порядке. За задание дают 2 балла: по одному за каждый файл, если программа выдаёт верный ответ и использует принципиально верный (не экспоненциальный) алгоритм. Достаточно пр …

Что нужно знать

  • Остаток от деления: a mod ma \bmod m — число от 00 до m−1m-1, такое что a=qm+(a mod m)a = qm + (a\bmod m).
  • Делимость: aa делится на bb тогда и только тогда, когда a mod b=0a \bmod b = 0.
  • Разложение модуля на простые множители — ключ к решению: 14=2⋅714 = 2\cdot 7, 26=2⋅1326 = 2\cdot 13.
  • Произведение x⋅yx\cdot y делится на p⋅qp\cdot q (простые p≠qp\ne q), если множители pp и qq в сумме «набираются» у xx и yy: одно число делится на pqpq, либо одно делится на pp, другое — на qq.
  • Число пар внутри одной группы размера kk: (k2)=k(k−1)2\binom{k}{2} = \dfrac{k(k-1)}{2}.
  • Число пар между двумя разными группами размерами kk и ll: k⋅lk\cdot l.
  • Сложность: полный перебор пар — O(n2)O(n^2), при n=105n=10^5 это 101010^{10} операций (слишком долго); проход с группировкой — O(n)O(n) или O(nlog⁡n)O(n\log n).
  • При n≤105n\le 10^5 и элементах до 10410^4 сумма может достигать 10910^9, произведение — до 10810^8; в C++/Pascal нужен 64-битный тип, в Python переполнения нет.

Алгоритм

  1. Прочитать входные данные: количество элементов NN и сами значения.
  2. Определить признак, связанный с условием (остаток от деления или простые множители модуля из условия).
  3. Завести переменные-агрегаты для каждого кластера (количество, сумма, максимум, топ-несколько значений).
  4. Один раз пройти по элементам, распределяя каждый в соответствующий кластер и обновляя агрегаты.
  5. По собранным агрегатам применить формулу задачи (суммирование, k⋅lk\cdot l, (k2)\binom{k}{2}, минимальная коррекция, перебор top-k) — без обращения ко всему массиву.
  6. Повторить для обоих файлов (маленький можно проверить и перебором) и вывести оба числа в требуемом порядке.

Ловушки

  • Полный перебор пар O(n2)O(n^2) на большом файле — программа не успевает выполниться, балл за файл B теряется.
  • Переполнение целочисленного типа: суммы до 10910^9, произведения до 101010^{10} — в C++/Pascal нужен long long/int64.
  • Ошибка при определении «дополняющих» кластеров: число, кратное сразу двум множителям модуля, нельзя относить к кластеру «только один из множителей».
  • Использование k2k^2 вместо (k2)=k(k−1)2\binom{k}{2}=\dfrac{k(k-1)}{2} при подсчёте пар внутри одного кластера — результат завышается.
  • В задачах на «максимум при ограничении» проверка только одной случайной коррекции вместо поиска минимальной по всем кандидатам.
  • Путаница «пара различных элементов» с использованием одного элемента дважды.
  • Отсутствие проверки программы на демонстрационном примере из условия перед запуском на большом файле.
reshay.ai/ege/informatika/zadanie-27 — задачи с разборами и тренажёр

Полный гайд и задачи задания 27 →