题解 ARC140E【Not Equal Rectangle】
萌萌构造题,随便构造构造就做出来了。似乎跟官方题解思路一样。
首先解决以下问题:给定一个质数 \(P\),构造一个每个数在 \(0\sim P-1\) 的大小为 \(P^2\times P^2\) 的矩阵,满足不存在 \(x_1\ne x_2,y_1\ne y_2\) 使得 \(a_{x_1,y_1}=a_{x_1,y_2}=a_{x_2,y_1}=a_{x_2,y_2}\)。
类似 \(9\times 9\) 的数独那样,我们将所求矩阵划分为 \(P^2\) 个大小为 \(P\times P\) 的宫。如果一个宫 \(M\) 满足 \(M_{i,j}=(i+j+k)\bmod P\),就称其为 \(k\) 类宫,记作 \(B_k\)。
例如,\(P=3\) 时:
\[B_0=
\begin{bmatrix}
0 & 1 & 2 \\
1 & 2 & 0 \\
2 & 0 & 1 \\
\end{bmatrix},
B_1=
\begin{bmatrix}
1 & 2 & 0 \\
2 & 0 & 1 \\
0 & 1 & 2 \\
\end{bmatrix},
B_2=
\begin{bmatrix}
2 & 0 & 1 \\
0 & 1 & 2 \\
1 & 2 & 0 \\
\end{bmatrix}
\]
对于所求矩阵的第 \(i\) 行第 \(j\) 列的宫,令其为 \(B_{ij\bmod P}\) 即可。
例如,\(P=3\) 时:
\[A=
\begin{bmatrix}
B_0 & B_0 & B_0 \\
B_0 & B_1 & B_2 \\
B_0 & B_2 & B_1 \\
\end{bmatrix}
=
\begin{bmatrix}
0 & 1 & 2 & 0 & 1 & 2 & 0 & 1 & 2 \\
1 & 2 & 0 & 1 & 2 & 0 & 1 & 2 & 0 \\
2 & 0 & 1 & 2 & 0 & 1 & 2 & 0 & 1 \\
0 & 1 & 2 & 1 & 2 & 0 & 2 & 0 & 1 \\
1 & 2 & 0 & 2 & 0 & 1 & 0 & 1 & 2 \\
2 & 0 & 1 & 0 & 1 & 2 & 1 & 2 & 0 \\
0 & 1 & 2 & 2 & 0 & 1 & 1 & 2 & 0 \\
1 & 2 & 0 & 0 & 1 & 2 & 2 & 0 & 1 \\
2 & 0 & 1 & 1 & 2 & 0 & 0 & 1 & 2 \\
\end{bmatrix}
\]
证明采用反证法:假设存在相等的四个数位于两行、两列的交点,显然必须在四个不同的宫,设左上、右上、左下、右下对应的宫分别是 \(a,b,c,d\) 类宫,则有 \(a-b=c-d\),但是这不可能发生。
解决了上面的问题,原问题便迎刃而解了。
代码:
const int P = 23;
cin >> n >> m;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
int val = ((i / P) * (j / P) + i + j) % P + 1;
cout << val << " \n"[j == m - 1];
}
}