Official

C - Pivot Editorial by riano_


与えられた操作は、選んだ値 \(s\) を中心として数直線上でちょうど対称な位置に各項を移すことと等価です。 したがって、最小値と最大値の差は常に一定であり、最小値の最小化を考えても問題ありません。 また、最小値と最大値の差を \(d\) とおきます。

最大値または最小値を \(s\) として操作を行うと、最小値は \(d\) 増える、または減ることになります。 したがって、最小値を \(d\) で割った余りが \(r\) の場合、この操作で最小値の最終的な値を \(r\) にすることができます。

続いて、 \(r\) をできるだけ \(0\) に近づけることを考えます。 最大値と最小値以外の項を \(s\) に選ぶと、\(r\) の値は変化します。 具体的には、最小値を \(m\) とすると、余りは \(2(s-m)\) だけ変化します。 この操作は、一度行うと数列内の相対的な位置が反転するため連続して行えませんが、一度最大値での反転を行うと、 \(r\) が変わらないまま「余りを \(2(s-m)\) だけ変化させる操作」を再度行えるようになります。 したがって、任意の回数行えますので、\(2(s-m)k\equiv t\) \((\mathrm{mod}\) \(d)\) となる \(k\) \((\geq 0)\) が存在するような任意の \(t\) だけ、\(r\) をずらすことが可能です。 そして、\(\mathrm{gcd}(d,2(s-m))\) の倍数であるような \(t\) に対してはこのような正の \(k\) が存在します(ただし、\(\mathrm{gcd}\) でいくつかの数の最大公約数を表します)。 すなわち、\(\mathrm{gcd}(d,2(s-m))\) 単位で \(r\) を調整することが可能です。

この操作を、任意の項を使って行えることから、全体としては \(\mathrm{gcd}(d,2(a_1-m),2(a_2-m),...,2(a_N-m)) = g\) 単位で \(r\) を調整できます。 以上から、本問題の答えは \(m\) \(\mathrm{mod}\) \(g+d\) と表すことができます。

posted:
last update: