Сумма этажей в школьной лестнице
Условие
В школе на ремонте решили пронумеровать пролёты лестницы подряд целыми числами: от этажа a до этажа b (включительно). Завхоз хочет быстро узнать, какая получится сумма всех этих номеров.
В больших школах значения могут не помещаться в 32-битный тип (как на олимпиадах), поэтому считайте аккуратно. В Python это не проблема, но в других языках нужно использовать 64-битные целые.
Формат ввода
В одной строке два целых числа a и b.
Формат вывода
Выведите одно целое число — сумму всех целых чисел от a до b включительно.
Ограничения
- -10^9 ≤ a ≤ 10^9
- -10^9 ≤ b ≤ 10^9
- Гарантируется, что a ≤ b
Пример
Ввод:
-2 3
Вывод:
3Как решать — идея подхода
Приём: Формула суммы арифметической прогрессии
Ключевое наблюдение: числа от a до b — это арифметическая прогрессия с разностью 1. Значит, сумму можно найти сразу, не складывая все подряд (это было бы слишком медленно при больших промежутках).
Приём работает потому, что у арифметической прогрессии среднее арифметическое первого и последнего равно среднему всех членов. Тогда сумма равна «среднее * количество».
План:
- Прочитай
aиb. - Посчитай количество чисел:
n = b - a + 1. - Используй формулу суммы:
ans = (a + b) * n / 2. - Так как ответ целый, деление на 2 делай аккуратно в целых: раздели на 2 тот множитель, который делится.
- Если
(a + b)чётное, удобно:((a + b) // 2) * n. - Иначе чётное обязательно
n, тогда:(a + b) * (n // 2). - Выведи
ans.
Сложность: O(1) по времени и памяти.
Частая ошибка: написать (a + b) * n // 2 в языке с 32-битным int — произведение может переполниться до деления. Поэтому важно либо использовать 64-битные типы, либо делить на 2 до умножения (как в шаге выше).
Разберись руками
Лестничные пролёты пронумеровали подряд: -2, -1, 0, 1, 2, 3. Нужно быстро сложить все эти номера и получить одну сумму.
- Отметь на ленте все числа, которые мы будем складывать: от -2 до 3 включительно.
- Сложи «крайние» числа: первое и последнее. Сколько получится: (-2) + 3 ?
- Если так же сложить следующие «крайние» пары (-1)+2 и 0+1, что ты заметишь про суммы этих пар?
- Сколько таких пар у нас получилось и чему равна общая сумма всех чисел от -2 до 3?
Идея: Складывай числа не подряд, а парами «с концов»: первое с последним, второе с предпоследним и так далее. Обычно суммы пар получаются одинаковыми, тогда достаточно знать сумму одной пары и сколько таких пар вышло; если чисел нечётное количество, одно среднее число останется без пары и его нужно добавить отдельно.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать