Автор: | Г. Гренкин | Ограничение времени: | 2 сек | |
Входной файл: | input.txt | Ограничение памяти: | 64 Мб | |
Выходной файл: | output.txt |
Возьмём N3 одинаковых кубиков. Раскрасим кубики в N цветов так, чтобы в каждый цвет было раскрашено ровно N2 кубиков. Сложим из всех кубиков один большой куб. Начнём протыкать этот куб спицами параллельно его рёбрам. Любая спица пройдёт сквозь ровно N кубиков.
Требуется сложить куб так, чтобы любая спица проходила сквозь кубики всех N цветов.
Во входном файле содержится единственное натуральное число N.
Выходной файл должен содержать номера цветов кубиков, перечисленные в порядке слева направо сверху вниз от ближней грани к дальней. Если существует несколько решений, выведите любое из них.
№ | Входной файл (input.txt ) |
Выходной файл (output.txt ) |
---|---|---|
1 |
|
|
Сперва рассмотрим задачу с квадратом: требуется расставить в клетках квадратной таблицы N × N числа от 1 до N так, чтобы в каждой строке и в каждом столбце встречались все N чисел (каждое число по одному разу). Таблица, заполненная таким образом, называется латинским квадратом.
Как построить латинский квадрат N × N? Запишем в первой строке числа от 1 до N. Во второй строке запишем числа на единицу больше, чем стоящие выше. При этом, если сверху стоит число N, то снизу будет стоять 1. Следующие строки заполняются аналогично.
1 2 3 2 3 1 3 1 2
Заметим, что число, стоящее в i-й строке и j-м столбце, можно вычислить по формуле 1 + (i + j)mod N.
Перейдём к задаче с кубом. Будем заполнять куб от ближней грани к дальней. Ближайшую к нам грань заполним так, как мы заполняли квадрат, а следующую грань заполним следующим образом: прибавим к числам, стоящим на ближайшей грани, единицу. Следующие грани заполняются аналогично.
1 2 3 2 3 1 3 1 2 2 3 1 3 1 2 1 2 3 3 1 2 1 2 3 2 3 1Напишем программу.
program cube; var n: integer; i, j, k: integer; begin read(n); for k := 1 to n do begin for j := 1 to n do begin for i := 1 to n do write(1 + (i+j+k) mod n, ' '); writeln; end; end; end.