Цена заклинания по слоям арены
Условие
В игре есть прямоугольная арена размера 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, и стоимость слоя линейно убывает — это арифметическая прогрессия.
План:
- Пусть
k = min(m, n) // 2— сколько раз можно снять «полный» слой, когда обе стороны ещё >= 2. - Суммируем слои i=0..k-1:
p(i) = 2*(m-2*i) + 2*(n-2*i) - 4 = 2*m + 2*n - 8*i - 4. - Сумма прогрессии:
S = k*(2*m + 2*n - 4) - 4*k*(k-1)(потому что сумма i равна k*(k-1)/2). - Считаем остаток:
m2 = m - 2*k,n2 = n - 2*k. - если один из них 0 — всё уже исчезло;
- если осталось 1×1, добавить 1;
- если осталось 1×t, граница — это все клетки полоски, добавить t.
Сложность: O(1) по времени и памяти.
Частая ошибка: применять формулу 2*a + 2*b - 4 к полоске 1×t. Там граница равна t, а не 2*t - 2.
Разберись руками
Есть арена 3×4 клетки. Маг платит по 1 монете за каждую клетку на границе, потом эта граница исчезает и остаётся прямоугольник на 2 меньше по высоте и по ширине. Так повторяется, пока клеток не останется.
- Посчитай руками, сколько клеток на границе прямоугольника 3×4. Подсказка: верхняя строка + нижняя строка + оставшиеся клетки по бокам (без углов).
- Теперь прогоним «снятие границы» по размерам. Старт 3×4. После каждого снятия границы размеры уменьшаются на 2 по высоте и по ширине (если что-то остаётся). Какие будут состояния после каждого шага?
- Сколько клеток на границе у прямоугольника 1×2?
- Сложи стоимость двух раундов: 10 монет за 3×4 и 2 монеты за 1×2. Сколько всего?
Идея: Считай стоимость по слоям: на каждом шаге находи, сколько клеток лежит на границе текущего прямоугольника, добавляй к сумме, затем мысленно «снимай рамку» и переходи к прямоугольнику, который меньше на 2 по обеим сторонам. Остановись, когда клеток больше не остаётся.
Решить задачу с автопроверкой на Python →
Куда дальше
- Школьный этап ВсОШ по информатике — как устроен первый этап и план подготовки за четыре недели
- БВИ по олимпиадам: в какие вузы берут — правила приёма вузов, разобранные построчно, со ссылкой на приказ у каждой строки
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам