Контрольная без одного задания

тема: Теория чисел (НОД, НОК, остатки) · уровень: продвинутый

Условие

В школе учитель составил контрольную из n заданий. Для каждого задания заранее записано число очков за «идеальное решение» — это числа a1, a2, ..., an.

Учитель хочет выкинуть ровно одно задание так, чтобы оставшиеся очки «хорошо делились» на одно и то же число как можно больше. То есть он хочет сделать НОД очков оставшихся заданий максимально возможным.

Найдите, какой максимальный НОД можно получить, если удалить ровно один элемент.

Формат ввода

Первая строка: целое число n. Вторая строка: n целых чисел a1, a2, ..., an.

Формат вывода

Одно целое число — максимальный возможный НОД всех чисел после удаления ровно одного элемента.

Ограничения

Пример

Ввод:

4
6 10 15 25

Вывод:

5

Как решать — идея подхода

Приём: Префиксные и суффиксные НОД

Ключевое наблюдение: если удалить элемент a[i], то НОД оставшихся чисел равен gcd(НОД слева от i, НОД справа от i). Потому что НОД по всем оставшимся — это НОД двух групп: a[0..i-1] и a[i+1..n-1].

Чтобы не пересчитывать НОД «с нуля» для каждого i (это было бы O(n^2)), заранее посчитаем:

Тогда для удаления i получаем за O(1): g_i = gcd(pref[i], suf[i+1]).

План:

Почему работает 0 в начале/конце: gcd(0, x) = x, значит крайние случаи (удаляем первый/последний) обрабатываются без отдельных if.

Сложность: O(n * log A), где A = max(ai), память O(n).

Частая ошибка: перепутать индексы в pref/suf (например, брать suf[i] вместо suf[i+1]) и случайно включить удаляемый элемент в НОД.

Решить задачу с автопроверкой на Python →

Куда дальше