Official

A - Reversi 2 Editorial by PCTprobability


操作をどのように行ってもマス \(1\) には \(1\) が書かれているため、\(A_1 = 0\) の場合答えは \(0\) です。以降、\(A_1 = 1\) とします。また、マス \(i\) に書かれている整数を \(X_i\) と置きます。

\(Y_i = (X_i + X_{i+1}) \bmod 2\) と定義した長さ \(N-1\) の数列 \(Y\) を考えます。\(Y\) は初期状態だと全ての要素が \(1\) となっています。すると、問題文の条件を満たす \(l,r\) を選び \(X\) を変更する操作は、\(Y\) の連続部分列のうち \((1,0,0,\dots,0,1)\) となっている部分を選び、両端の \(1\)\(0\) に置き換える操作と言い換えることが出来ます。目標は \(B_i = (A_i + A_{i+1}) \bmod 2\) と定義される長さ \(N-1\) の数列 \(B\) に対して \(Y = B\) とすることです。

まず、\(B = (0,0,\dots,0)\) の時の答えを求めます。\(N-1\) が奇数のときは答えは \(0\) です。そうでないときは、初手で選ぶことが出来るのは \(Y\) の隣接した \(2\) 項なので \(N-2\) 通りです。すると、今後の操作に選んだ \(2\) 項はないものと考えることが出来ます。よって、長さが \(2\) 短い問題に帰着されます。よって、この時の答えは \((N-2) \times (N-4) \times ... \times 3 \times 1 = (N-2)!!\) です。

さて、\(B\)\(0\) のみからなる極大な連続部分列が複数あった場合を考えます。その場合でも部分列同士で操作が干渉することはありません。よって、長さが奇数のものがあれば答えは \(0\) となります。全ての長さが偶数の場合、それらの長さを \(x_1,x_2,\dots,x_k\) と置きます。長さ \(l\) の部分列に対して \(\frac{l}{2}\) 回操作をするため、どの部分列にいつ操作をするかは \(\frac{\left(\sum_{i=1}^{k} \frac{x_i}{2}\right)!}{\prod_{i=1}^{k} \left(\frac{x_i}{2}\right)!}\) 通りあり、それぞれに対して各部分列内部での操作方法が \(\prod_{i=1}^{k} (x_i-1)!!\) 通りあるため、これらを掛け合わせたものが答えです。上記は \(\mathrm{O}(N)\) で行うことが出来ます。

posted:
last update: