Цена заклинания по слоям арены

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

Условие

В игре есть прямоугольная арена размера m×n клеток. Маг каждый раунд ставит «щит» по границе текущей арены и платит по 1 монете за каждую клетку границы.

После этого вся граница исчезает, и арена уменьшается: остаётся прямоугольник на 2 клетки меньше по высоте и по ширине (если он существует). Маг повторяет это, пока не останется ни одной клетки.

Посчитайте, сколько монет маг заплатит суммарно.

Важно: ответ может не помещаться в 32-битный тип (как на олимпиадах). Используйте 64-битные целые. В Python это не проблема.

Формат ввода: Два целых числа m и n.

Формат вывода: Одно целое число — суммарная стоимость.

Ограничения: 1 ≤ m ≤ 10^9 1 ≤ n ≤ 10^9

Пример Ввод:

3 4

Вывод:

12

Пояснение к примеру: сначала граница 3×4 содержит 10 клеток, затем остаётся 1×2 (граница 2 клетки). Итого 12.

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

Приём: Арифметическая прогрессия по слоям

Ключевое наблюдение: маг платит не за «все клетки», а только за границу текущего прямоугольника. После снятия границы размеры уменьшаются на 2 по каждой стороне, то есть мы идём по слоям: (m, n) → (m-2, n-2) → …

Для прямоугольника a×b, где a>=2 и b>=2, число клеток границы равно 2*a + 2*b - 4 (углы не должны считаться дважды). Значит для i-го слоя: a = m - 2*i, b = n - 2*i, и стоимость слоя линейно убывает — это арифметическая прогрессия.

План:

Сложность: O(1) по времени и памяти.

Частая ошибка: применять формулу 2*a + 2*b - 4 к полоске 1×t. Там граница равна t, а не 2*t - 2.

Разберись руками

Есть арена 3×4 клетки. Маг платит по 1 монете за каждую клетку на границе, потом эта граница исчезает и остаётся прямоугольник на 2 меньше по высоте и по ширине. Так повторяется, пока клеток не останется.

Идея: Считай стоимость по слоям: на каждом шаге находи, сколько клеток лежит на границе текущего прямоугольника, добавляй к сумме, затем мысленно «снимай рамку» и переходи к прямоугольнику, который меньше на 2 по обеим сторонам. Остановись, когда клеток больше не остаётся.

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

Куда дальше