Official

C - Permutation Addition Editorial by m_99


初期状態における \(A\) の値の総和を \(S\) とします。\(A\) の値をすべて等しくした状態において、\(A\) の値の総和は \(N\) の倍数となります。また、操作を \(1\) 回行うと \(A\) の値は \(1+2+\ldots+N = \frac{N(N+1)}{2}\) 増えるため、\(A\) の値をすべて等しくするには \(S, S+\frac{N(N+1)}{2}, S+2\frac{N(N+1)}{2}, \ldots\) のいずれかが \(N\) の倍数になることが必要です。特に、\(2\frac{N(N+1)}{2}\)\(N\) の倍数なため、\(S, S+\frac{N(N+1)}{2}\) のどちらかが \(N\) の倍数になることが必要です。

逆に、上の条件を満たす場合は常に \(A\) の値をすべて等しくすることが可能です。
順列を \((1,2,3, \ldots,N), (N,N-1,N-2, \ldots,1)\) として続けて行うと、\(A\) の値がすべて \(N+1\) 増えます。ここで、\(2\) 回目の順列を \((N-1, N, N-2, \ldots,1)\) とすると、\(a_1\)\(N\)\(a_2\)\(N+2\)\(a_3,a_4,\ldots,a_N\)\(N+1\) ずつ増えます。値を等しくするという条件はすべての値から定数を引いても影響を受けないため、整理のためにすべての値から \(N+1\) を引くと \(a_1\)\(-1\)\(a_2\)\(+1\) されたことになります。このことから、\(a_1,a_2\) に相当する要素を適当に定めることで任意の \(2\) 要素をそれぞれ \(+1, -1\) することが出来ます。
必要に応じて高々 \(1\) 回操作をすると、\(A\) の値総和は \(N\) の倍数となります。ここで、平均値を \(x\) とします。もし \(A\)\(x\) でない値が含まれている場合、\(x\) より大きな値と \(x\) より小さな値を選び、それぞれ先の方法で \(-1, +1\) する、ということを繰り返します。操作によって総和は変わらず、\(x\) でない値が存在する場合は \(x\) より大きい値と \(x\) より小さい値がともに存在することが言える(そうでない場合、総和が \(x \times N\) にならない)ため、これの繰り返しによって有限回の操作で目的を達成できると言えます。

操作回数の見積もりを行います。高々 \(1\) 回操作を行った結果、\(A\) の値は最大で \(100\) となっています。このことから、平均値も \(100\) 以下となります。この平均値に一致させるために必要な \(+1, -1\) の回数はそれぞれ \(100\) 回以下なので、単純に \(N\) 倍(最大で \(50\) 倍)すると \(5000\) 回となり、\(10^4\) 回以下という制限に対して十分余裕があります。

posted:
last update: