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