Фонари на проспекте
Условие
В городе Нумерополис все дома на проспекте пронумерованы подряд: 1, 2, 3, ...
Мэр решил поставить одинаковые фонари у домов, чьи номера делятся на число k без остатка. Тебе поручили быстро посчитать, сколько таких домов попадёт на отрезок проспекта от дома l до дома r включительно.
Важно: значения могут не помещаться в 32-битный тип (как на олимпиадах), поэтому считай аккуратно.
Формат ввода
Одной строкой вводятся три целых числа k, l, r.
Формат вывода
Выведите одно целое число — сколько чисел на отрезке [l, r] делятся на k.
Ограничения
- 1 ≤ k ≤ 10^9
- 1 ≤ l ≤ r ≤ 10^9
Пример
Ввод:
3 1 10
Вывод:
3Как решать — идея подхода
Приём: Целочисленное деление (подсчёт кратных через floor)
Ключевое наблюдение: числа, делящиеся на k, идут ровно через каждые k: k, 2k, 3k, … Поэтому вместо перебора от l до r (это слишком долго) можно посчитать, сколько кратных попадает в начало проспекта.
Приём: считаем «префиксную» функцию f(x) — сколько чисел на отрезке [1..x] делятся на k. Это просто x // k, потому что среди 1..x есть ровно столько полных групп по k.
Тогда ответ на [l..r] получается вычитанием: всё, что до r, минус всё, что строго до l, то есть до l-1.
План:
- Прочитай k, l, r.
- Посчитай
a = r // k— количество кратных на [1..r]. - Посчитай
b = (l - 1) // k— количество кратных на [1..l-1]. - Выведи
a - b.
Мини-сниппет формулы:
ans = r//k - (l-1)//k
Сложность: O(1) по времени и O(1) по памяти.
Частая ошибка: забыть про l-1 и посчитать r//k - l//k — это ломается, когда l само кратно k (например k=3, l=3, r=3: правильный ответ 1, а неверная формула даст 0).
Разберись руками
Номера домов идут подряд. Фонарь ставим у тех, чей номер делится на 3 без остатка. Нужно понять, сколько таких номеров попадает в отрезок от 1 до 10 включительно.
- Отметь на ленте от 1 до 10 все числа, которые делятся на 3 без остатка (то есть кратные 3).
- Сколько чисел ты отметил(а)? (Это и есть ответ для примера.)
- Теперь найди это же число «быстро»: сколько кратных 3 помещается от 1 до 10, если считать группами по 3? Введи значение 10 // 3.
- Если бы отрезок начинался не с 1, мы бы «убрали» все кратные до числа перед началом. В нашем примере начало — 1, значит число перед ним — 0. Посчитай: 10 // 3 - 0 // 3.
Идея: Вместо того чтобы перебирать все числа на отрезке, можно посчитать, сколько кратных нужного числа есть от 1 до правого конца, потом посчитать, сколько кратных есть от 1 до числа перед левым концом, и вычесть второе из первого.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать