E - Not Equal Rectangle Editorial
by
nok0
以下、 \(0\)-indexed で考えます。また、 \(0\) 以上 \(24\) 以下の整数で塗り分ける問題とします。(最後に全要素に \(1\) を足せばよいです。)
略解
\(P = 23\) とします。 \(i\) 行目 \(j\) 列目に \((\lfloor \frac{i}{P} \rfloor \lfloor\frac{j}{P} \rfloor + i + j )\bmod P\) を書き込むこととすると、与えられた条件全てを満たします。
実装例(Python):
n, m = map(int, input().split())
p = 23
for i in range(n):
print(*[((i // p) * (j // p) + i + j) % p + 1 for j in range(m)])
解説
より一般に 任意の素数 \(P\) にたいして、\(0\) 以上 \(P\) 未満の整数を使って \(P^2 \times P^2\) のマス目を条件を満たすように塗り分ける方法を考えます。
この塗り分け方が分かれば、 \(P=23\) として \(P^2 = 529 \times 529\) のマス目を構築し、上から \(N\) 行目、左から \(M\) 行目までを出力することでこの問題に答えられます。
\(P\times P\) のマス目を小ブロックと呼びます。\(P\) 種類の小ブロック \(B_0,B_1,\ldots,B_{P-1}\) を作り、適切に \(P\times P\) 個配置することで \(P^2\times P^2\) のマス目を構築します。
小ブロックは、 \(B_k\) の \((i,j)\) 成分を \((i + j + k) \bmod P\) で定めます。
たとえば、\(P=3\) のとき \(B\) は以下になります。
\[ B_0 = \begin{pmatrix} 0 & 1 & 2\\ 1& 2 & 0 \\ 2& 0 & 1 \\ \end{pmatrix}, B_1 = \begin{pmatrix} 1& 2 & 0 \\ 2& 0 & 1 \\ 0 & 1 & 2\\ \end{pmatrix}, B_2 = \begin{pmatrix} 2& 0 & 1 \\ 0 & 1 & 2\\ 1& 2 & 0 \\ \end{pmatrix} \]
上記で定めた小ブロックを \(P\times P\) 個配置します。 \((i,j)\) 成分には \(B_{ij \bmod P}\) を置けば良いです。
\(P=3\) のときの具体例を示します。
\[ \begin{pmatrix} B_0& B_0 & B_0 \\ B_0& B_1 & B_2\\ B_0& B_2 & B_1 \\ \end{pmatrix} = \begin{pmatrix} 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{pmatrix} \]
以上の構築方法が条件を満たしていることを証明します。
小ブロックの各行各列に出現する数字は相異なることから、\((x_1,x_2,y_1,y_2)\) が小ブロック内部にある、また小ブロック \(2\) つにまたがる場合は条件を満たしています。このことから\((x_1,x_2,y_1,y_2)\) が小ブロック \(4\) つにまたがる場合に条件を満たしていることを確認できれば良いです。
\((x_1,x_2,y_1,y_2)\) が小ブロック \(4\) つにまたがる場合、小ブロックの番号を左上から順に時計回りに \(a,b,c,d\) とします。四点全てが一致する場合、\(B\) の構築方法から \(a-d = b-c\) が成り立ちますが、これは \((i,j)\) 要素が \(ij\bmod P\) なことから起こりえません。
以上より示されました。
posted:
last update: