Общий день двух расписаний
Условие
В школе есть два события: одно повторяется каждые a дней, другое — каждые b дней. Сегодня оба события случились в один день.
Определи, через сколько дней они снова совпадут в один и тот же день.
Важно: искомое число может быть больше, чем помещается в 32-битный тип (как на олимпиадах), хотя входные числа небольшие.
Формат ввода
В одной строке записаны два целых числа a и b.
Формат вывода
Выведи одно целое число — через сколько дней события снова совпадут.
Ограничения
- 1 ≤ a ≤ 1 000 000
- 1 ≤ b ≤ 1 000 000
Пример
Ввод:
6 15
Вывод:
30Как решать — идея подхода
Приём: НОК через НОД (алгоритм Евклида)
Ключевое наблюдение: событие с периодом a бывает в дни, кратные a (a, 2a, 3a, …), а с периодом b — в дни, кратные b. Значит, следующий общий день — это наименьшее число, которое делится и на a, и на b, то есть НОК(a, b).
Почему работает приём: напрямую перебирать дни долго, зато есть связь НОК и НОД: lcm(a, b) = a / gcd(a, b) * b. НОД (наибольший общий делитель) быстро находится алгоритмом Евклида за логарифмическое время.
План решения:
- Прочитай a и b.
- Найди
g = gcd(a, b)алгоритмом Евклида: пока b != 0 делайa, b = b, a % b. - Посчитай ответ как
l = (a // g) * b. - Выведи l.
Сложность: O(log(min(a, b))) по времени и O(1) по памяти.
Частая ошибка: считать a * b // g. В Python это обычно безопасно, но в языках с фиксированными int можно получить переполнение. Правильнее делить раньше: (a // g) * b.
Разберись руками
Одно событие повторяется каждые 6 дней, другое — каждые 15 дней. Сегодня они совпали. Хочется найти первый следующий день, который делится и на 6, и на 15.
- Отметь на ленте от 1 до 30 все числа, которые кратны 6 (то есть делятся на 6 без остатка).
- Теперь на той же ленте от 1 до 30 отметь все числа, которые кратны 15 (делятся на 15 без остатка).
- Какое самое маленькое число оказалось отмечено в обоих списках? Это и есть первый день, когда события снова совпадут.
Идея: Совпадение будет в те дни, которые одновременно являются кратными обоих периодов. Нужно найти самое маленькое такое число (его называют «наименьшее общее кратное»): можно выписать кратные обоих периодов и взять первое общее.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- На программиста по олимпиаде: путь по классам — что даёт диплом, куда с ним берут на ИТ-направления и почему решает 9 класс
- Вердикты судьи: WA, TLE, RE, PE, CE — что значит каждый код проверяющей системы и где искать причину