CubeCraft: сколько кубиков с краской
Условие
В игре CubeCraft ты собрал большой куб из n×n×n одинаковых маленьких кубиков. Потом ты окунул конструкцию в краску: прокрасились все внешние грани большого куба. После этого ты разобрал куб на маленькие.
Для выдачи наград игре важно, сколько маленьких кубиков попало в каждую категорию по числу окрашенных граней:
- 0 окрашенных граней
- ровно 1 окрашенная грань
- ровно 2 окрашенные грани
- 3 или больше окрашенных граней
Заметь: при n=1 единственный кубик будет окрашен со всех 6 сторон, поэтому он относится к категории «3 или больше».
Формат ввода Одно целое число n.
Формат вывода Выведите 4 целых числа через пробел: количество кубиков с 0, 1, 2, 3+ окрашенными гранями (в таком порядке).
Ограничения
- 1 ≤ n ≤ 1 000 000
- Ответы могут не помещаться в 32-битный тип (как на олимпиадах), используйте 64-битные целые. В Python это не проблема.
Пример Ввод:
3
Вывод:
1 6 12 8Как решать — идея подхода
Приём: Комбинаторный подсчёт по типам кубиков (внутри/грань/ребро/угол)
Ключевое наблюдение: число окрашенных граней у маленького кубика зависит только от того, где он стоит в большом кубе — внутри, на грани (но не на ребре), на ребре (но не в углу) или в углу. После окунания красятся все внешние грани большого куба, значит:
- внутри: 0 окрашенных граней;
- «середина» внешней грани: ровно 1;
- середина ребра: ровно 2;
- угол: 3 (вообще-то ровно 3, но нам нужна категория 3+).
Почему это работает: у каждого типа фиксированное число «выходов наружу», и таких кубиков легко посчитать формулой.
План:
- Разберись с маленькими n отдельно:
- n=1: один кубик имеет 6 окрашенных граней → всё в категорию 3+.
- n=2: все 8 кубиков — угловые → всё в 3+.
- Для n>=3 введи
t = n - 2— длина «внутреннего» куба без внешнего слоя. - Посчитай по формулам:
- 0 граней:
t^3(полностью внутренние) - 1 грань:
6 * t^2(на каждой из 6 граней квадрат t×t) - 2 грани:
12 * t(12 рёбер, на каждом по t кубиков без углов) - 3+ граней:
8(8 углов) - Выведи 4 числа в порядке 0, 1, 2, 3+.
Сложность: O(1) по времени и памяти.
Частая ошибка: забыть, что формулы с t = n-2 дают нули/отрицательные значения при n=1 или n=2 — эти случаи нужно обработать отдельно.
Разберись руками
Берём куб 3×3×3 из 27 маленьких кубиков и красим снаружи все его грани. Потом разбираем и считаем, сколько маленьких кубиков имеют 0, 1, 2 и 3+ окрашенных граней.
- Сначала найди кубики с «3 или больше» окрашенными гранями. Подумай: какие кубики точно окрашены сразу с трёх сторон, и сколько таких мест у большого куба?
- Теперь кубики с ровно 2 окрашенными гранями. Это кубики на рёбрах, но НЕ в углах. Сколько рёбер у куба и сколько таких кубиков на одном ребре при n=3?
- Теперь кубики с ровно 1 окрашенной гранью. Это кубики в центре каждой большой грани (не на рёбрах). Сколько больших граней у куба и сколько «центров» на одной грани 3×3?
- Остались кубики с 0 окрашенных граней — они полностью внутри. Если у 3×3×3 убрать весь внешний слой (всё, что касается поверхности), сколько кубиков останется внутри?
Идея: Раздели маленькие кубики по месту: углы дают 3+ окрашенных граней, рёбра (без углов) дают 2, центры граней дают 1, а то, что не касается поверхности, даёт 0. Потом просто посчитай, сколько таких мест бывает, и выведи количества в нужном порядке.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам
- Олимпиада по информатике: с чего начать — два мира олимпиад — ВсОШ и перечневые: этапы, задания и на каком языке писать