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