Полив по расписанию
Условие
У Саши на подоконнике стоит N растений. Для каждого растения он завёл правило: если период этого растения равен p, то Саша поливает его в каждый день с номером, который делится на p (то есть в дни p, 2p, 3p, ...).
Саша хочет понять, сколько раз всего он возьмёт лейку за первые D дней (считаем дни пронумерованными от 1 до D).
Посчитайте общее число поливов всех растений за дни 1..D.
Формат ввода
Первая строка: два целых числа N и D. Вторая строка: N целых чисел p1, p2, ..., pN — периоды растений.
Формат вывода
Выведите одно целое число — общее количество поливов.
Ограничения
- 1 ≤ N ≤ 2000
- 1 ≤ D ≤ 100000
- 1 ≤ pi ≤ 100000
Пример
Ввод:
3 10
2 3 5
Вывод:
10
Пояснение: за 10 дней растение с периодом 2 поливают 5 раз, с периодом 3 — 3 раза, с периодом 5 — 2 раза. Итого 10.
Как решать — идея подхода
Приём: Подсчёт кратных (деление нацело)
Ключевое наблюдение: растение с периодом p поливают ровно в дни p, 2p, 3p, … Пока номер дня не превысит D. Значит, нужно понять, сколько таких кратных поместится в диапазон 1..D.
Приём: «подсчёт кратных через деление нацело». Он работает, потому что целая часть от D / p как раз и есть максимальное k, для которого k*p ≤ D. То есть это количество поливов одного растения.
План решения:
- Прочитать N и D.
- Прочитать список периодов p1..pN.
- Завести ответ total = 0.
- Для каждого p:
- добавить к ответу
D // p. - Вывести total.
Мини-сниппет формулы:
- поливов для одного растения:
cnt = D // p - общий ответ: сумма этих cnt.
Сложность: O(N) по времени и O(1) доп.памяти (кроме хранения списка). При N ≤ 2000 это мгновенно.
Частая ошибка: пытаться симулировать по дням и отмечать, какие растения поливать (O(N*D) до 2e8 операций) — это слишком медленно и здесь не нужно.
Разберись руками
Есть 3 растения с периодами 2, 3 и 5. Дни идут от 1 до 10. Растение поливают в те дни, номер которых делится на его период — нужно сложить все поливы.
- Растение с периодом 2: сколько дней из 1..10 делятся на 2 (2,4,6,8,10)? Сколько поливов будет у этого растения?
- Растение с периодом 3: сколько дней из 1..10 делятся на 3 (3,6,9)? Сколько поливов?
- Растение с периодом 5: сколько дней из 1..10 делятся на 5 (5,10)? Сколько поливов?
- Теперь сложи поливы всех трёх растений: 5 + 3 + 2. Сколько раз всего Саша возьмёт лейку за 10 дней?
Идея: Для каждого растения отдельно посчитать, сколько раз за первые D дней встречаются дни, кратные его периоду, а потом сложить эти количества по всем растениям.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- БВИ и льготы при поступлении — какой диплом что даёт и сколько лет он действует
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому