题解 AT4512 【[AGC030C] Coloring Torus】

· · 题解

首先,对于 k \leq 500,我们可以像下面这样无脑构造解:

k
1 1 1 ... 1
2 2 2 ... 2
3 3 3 ... 3
. . . ... .
. . . ... .
. . . ... .
k k k ... k

然后考虑 k > 500 怎么办。

用上面的办法肯定没法搞。考虑斜着填数:

1 2 3 4 ... n
2 3 4 ... n 1
3 4 ... n 1 2
4 ... n 1 2 3
. ... . . . .
. ... . . . .
. ... . . . .
n 1 2 . . . n-1

这样填出来也是合法的。考虑对这个下手:

比如一个 n=4 的矩阵:

1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3

我们考虑随便钦定一斜行,让它加入一个新数字,和原有的数字交替出现:

1 2 3 4
2 3 5 1
3 4 1 2
5 1 2 3

不难发现,这样也一定是合法的。然后我们还可以选择更多的斜行进行此操作。不难发现,我们用这个方法能加入的数字个数就是 2n 级别的,正好能完成题目的要求。

然后这题就做完了。

```cpp int nx[510]; int A[510][510]; int main() { int k = ri; if(k <= 500) { cout << k << endl; for(int i = 1; i <= k; i++) for(int j = 1; j <= k; j++) printf("%d%c", i, " \n"[j == k]); } else { int n = 500, N = 0; for(int i = 1; i <= n; i++) nx[i] = i + 1; nx[n] = 1, cout << 500 << endl, k -= n; for(int i = 1; i <= n; i++) { int a = ++N, b = k ? ++N : N; k -= b - a; for(int x = 1, y = i; x <= n; x++, y = nx[y]) A[x][y] = x & 1 ? a : b; } for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) printf("%d%c", A[i][j], " \n"[j == n]); } return 0; } ```