公式

D - Symmetric Matrix 解説 by sounansya


この解説では全て 0-indexed で考えます。

\(Y_{Y_i} \neq i\) を満たす \(i\) が存在する場合の答えは No です。以降はこれ以外の場合を考えます。


以下の条件を全て満たす \(N\)\(N\) 列の整数係数行列 \(A\)良い行列 と呼びます。

  • \(1\le A_{i,j}\le N\) \((0\le i < N,0\le j< N)\)
  • \(A_{i,j} = A_{j,i}\) \((0\le i < N,0\le j< N)\)
  • \(A_{i,j_1} \neq A_{i,j_2}\) \((0\le i < N,0\le j_1 < j_2< N)\)

まず、 \(A\) を良い行列、 \(P\)\((0,1,\ldots,N-1)\) の順列とすると \(B_{i,j}=A_{P_i,P_j}\) で定義される \(N\)\(N\) 列の整数係数行列 \(B\) も良い行列であることが分かります。 \(\ldots (\star)\)

証明:

\(1\) つ目の条件は明らかです。

\(2\) つ目の条件は \(B_{i,j}=A_{P_i,P_j}=A_{P_j,P_i}=B_{j,i}\) より従います。

\(3\) つ目の条件は \( A_{i,j_1} \neq A_{i,j_2}\) \((0\le i< N, 0\le j_1 , j_2< N,j_1 \color{red}\neq\color{black} j_2)\) と言い換えられますが、この形から \(B_{i,j_1} = A_{P_i,P_{j_1}} \neq A_{P_i,P_{j_2}} = B_{i,j_2}\) となり従います。

この性質から、 \(Y_i=i\) を満たす \(i\) の個数と \(B_{i,i}=1\) を満たす \(i\) の個数が一致するような \(B\) を構成することができれば条件を全て満たす \(A\) が構成できることが分かります。


1. \(N\) が奇数のとき

\(X_k^c\)\(A_{k,X_k^c}=c\) を満たす整数とします(この値は一つに定ります)。すると、\(X^c=(X_1^c,X_2^c,\ldots,X_N^c)\)\(X_{X_k^c}^c=k\) を満たす必要があります。このことから各 \(c\) に対し整数 \(c\)\(A\) の対角線上に \(1\) つ以上含まれる必要があるため、\(1\) 以上 \(N\) 以下の整数は対角線上にちょうど \(1\) つずつ含まれることが分かります。したがって、 \(Y_{Y_i} = i\) を満たす \(i\) が複数存在する場合も答えは No です。

逆にそれ以外の場合の答えは Yes です。なぜならば、 \(B_{i,j}=(i+j) \bmod N+1\) で定めた良い行列 \(B\) に対し \((\star)\) を用いれば解を構成できるからです。

2. \(N\) が偶数のとき

\(v\)\(Y_i=i\) を満たす \(i\) の個数とします(この個数は必ず偶数です)。

\((\star)\) より \(B_{i,i}=i\) を満たす \(i\) の個数が \(v\) 個であるような良い行列 \(B\) が構成できれば良いです。そしてこれは以下の手順で構成できます:

まず全ての \(i\) に対し \(B_{i,i}=1\) が成り立つ \(B\) を以下のように round-robin 方式で構成します。

  • \(B_{i,i}=1\) とする。
  • \(\displaystyle S=\left(0,2,4,\ldots,N-2\right),T=\left(1,3,5,\ldots,N-1\right)\) とする。
  • \(C=2,3,\ldots,N\) に対して以下の操作を行う:
    • \(\displaystyle i=0,1,\ldots,\frac{N}2-1\) に対し \(B_{S_i,T_i}=C\) とする。
    • \(S_0\) のみ固定して rotate する。つまり、 \(S,T\) をそれぞれ \((S_0,S_2,S_3,\ldots,S_{N-1},T_{N-1}),(S_1,T_0,T_1,\ldots,T_{N-2})\) に同時に置き換える。

例えば \(N=8\) の場合は以下のようになります:

12384756
21653874
36127548
85216437
43761285
78542163
57438612
64875321

このように構成した \(B\) は 各 \(j\) に対し \(2j,2j+1\) 行・ \(2j,2j+1\) 列のみをくり抜いた \(2\times 2\) 行列が全て \(\displaystyle \begin{pmatrix} 1 & 2 \\ 2 & 1 \end{pmatrix}\) となります。したがって、これらのいくつかを \(\displaystyle \begin{pmatrix} 2 & 1 \\ 1 & 2 \end{pmatrix}\) に変えることで \(B_{i,i}=1\) が成り立つ \(i\) の個数がちょうど \(v\) 個であるような \(B\) を構成できます。

あとはこの \(B\) に対し適切な \(P\) を作用させることで解を構成することができます。


以上を適切に実装することでこの問題に正答することができます。計算量は各テストケースあたり \(O(N^2)\) です。

投稿日時:
最終更新: