公式

L - Avoid Multiple 解説 by Nzt3


\(A\) の要素は \(M\) で割ったあまりを考えます。

初期状態で操作可能な \(i\) が存在しない場合、答えは No です。

\(A\) の要素の総和が \(M\) の倍数である場合、どのように操作しても最終的に \(M\) の倍数が作られます。答えは No です。

以下ではそれ以外の場合を考えます。

初期状態で操作可能な \(i\) が存在します。操作を行い、操作可能な\(i\)が1つ以上存在する状態を最後まで維持できれば良いです。これは必ず可能です。

操作不可能な \(i\) が存在するとき

\(i=x\) が操作可能、 \(i=x+1\) が操作不可能であるとき、 \(x\) を操作すればよいです。

この \(x\) の周辺では \(A\) は次のようになっています。(操作可能な \(i\) と操作不可能な \(i\) が両方存在するため、 \(N\ge 3\) に限られます。)

\(A_x=a,A_{x+1}=-b,A_{x+2}=b \ (a \neq b)\) \(A=(\cdots, a, -b, b ,\cdots)\)

このとき、 \(i=x\) として操作すると次のようになります。

\(A=(\cdots, a-b, b ,\cdots)\)

ここで、 \(a-b+b \neq 0\) なので操作可能な \(i\) が存在しています。

\(i=x\) が操作可能、 \(i=x-1\) が操作不可能であるときも同様に \(i=x\) として操作してよいです。

操作不可能な \(i\) が存在しないとき

\(i=1\) として操作を行えばよいです。

\(N \ge 4\) の場合を考えます。 このとき、 \(A=(a,b,c,d\cdots) (a+b \neq 0,b+c \neq 0,c+d \neq 0)\) となっています。 \(i=1\) として操作を行うと、 \(A=(a+b,c,d,\cdots)\) となりますが、 \(c+d \neq 0\) なので操作可能な \(i\) が存在しています。

\(N=2\) の場合は自明であり、 \(N=3\) の場合も \(A\) の総和が \(0\) ではないという仮定と \(N=2\) の結果から操作可能です。

実装

操作不可能な \(i\) が連続しているとき、「操作不可能な \(i\) が存在するとき」の操作を繰り返すことで操作不可能な \(i\) が存在しないようにできます。 あとは「操作不可能な \(i\) が存在しないとき」の考察を用いて前から順に操作することができます。

投稿日時:
最終更新: