Фонтаны с «сбитым» таймером

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

Условие

В школьном дворе поставили два фонтана с таймерами.

Найди самый ранний момент времени (в минутах от начала отсчёта), когда оба фонтана включатся одновременно. Если такого момента не бывает — выведи -1.

Важно: ответ может быть больше, чем помещается в 32-битный тип (как на олимпиадах), то есть может понадобиться 64-битная арифметика.

Формат ввода

В одной строке записаны два целых числа m и p.

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

Выведи одно целое число — минимальное t >= 0, такое что:

Если такого t не существует, выведи -1.

Ограничения

Пример

Ввод:

4 7

Вывод:

8

Пояснение: фонтан A включается в 0,4,8,12,... а фонтан B — в 1,8,15,... Первый общий момент — 8.

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

Приём: Расширенный алгоритм Евклида (обратный элемент по модулю)

Ключевое наблюдение: общий момент t должен одновременно быть кратен m и давать остаток 1 по модулю p. Если t кратен m, то t = m*k для некоторого целого k. Подставляем во второе условие:

t = m*k и t % p = 1 => m*k ≡ 1 (mod p).

Это линейное сравнение. Оно имеет решение тогда и только тогда, когда gcd(m, p) делит 1, то есть когда gcd(m, p) = 1. В этом случае у числа m есть обратный элемент по модулю p.

Почему работает расширенный Евклид: он находит такие x и y, что x*m + y*p = gcd(m,p). Если gcd = 1, получаем x*m + y*p = 1, значит x*m ≡ 1 (mod p), то есть x — это и есть обратный к m по модулю p.

План решения:

Сложность: O(log(min(m,p))) по времени, памяти почти не нужно.

Частая грабля: забыть проверку gcd(m,p)=1 и пытаться «найти обратный» всегда — тогда на некоторых тестах решения не существует. Также не перепутай: нужен обратный для m по модулю p, а не наоборот.

Разберись руками

Фонтан A включается каждые 4 минуты: 0, 4, 8, 12, ... Фонтан B включается в 1 минуту и дальше каждые 7 минут: 1, 8, 15, ... Нужно найти самое раннее общее включение.

Идея: Сначала выпиши (или проверяй) моменты первого фонтана как кратные его шагу, а моменты второго — как числа с нужным остатком при делении на его шаг. Самый ранний общий момент — первое число, которое подходит сразу под оба условия; если такого числа вообще не находится, значит расписания «не совпадают» и ответа нет.

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

Куда дальше