Реклама по расписанию

тема: Арифметика и формулы (O(1)) · уровень: базовый

Условие

Ты смотришь длинный ролик. Плеер умеет вставлять рекламу по двум независимым «будильникам»:

Если в одну и ту же секунду срабатывают оба, реклама всё равно показывается один раз.

Посчитай, сколько раз реклама покажется за первые n секунд просмотра (то есть в моменты времени 1, 2, ..., n). Момент времени 0 не учитывается.

Формат ввода Одной строкой даны три целых числа a b n.

Формат вывода Выведи одно целое число — сколько секунд t (1 ≤ t ≤ n) делятся на a или на b.

Ограничения

Пример Ввод:

3 5 20

Вывод:

9

Пояснение: срабатывания в секундах 3, 5, 6, 9, 10, 12, 15, 18, 20 (в 15 оба сразу, но считается один раз).

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

Приём: Принцип включения-исключения + НОД/НОК

Ключевое наблюдение: реклама показывается в секунды t, которые делятся на a или на b. Если t делится на оба, событие одно, значит такие секунды нельзя посчитать дважды.

Для этого подходит принцип включения-исключения:

«Одновременно кратные» — это кратные НОК(a, b). НОК удобно находить через НОД: lcm = a // gcd(a, b) * b. Важно делить до умножения, чтобы не получить лишнее переполнение в языках с 32-битным int (в Python всё равно безопасно, но привычка полезная).

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

Сложность: O(log(min(a, b))) по времени из-за НОД, память O(1).

Частая ошибка: вычитать n // (a*b) вместо n // lcm — это верно только когда a и b взаимно просты.

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

Куда дальше