Official

N - Range Flip Editorial by KoD


\(A'_i = A_{i} \oplus A_{i + 1} \, (A'_0 = A_1, A'_N = A_N)\) で定められる数列 \(A'\) を考えると、\(A\) の区間に対する操作は、\(A'_l\)\(1 - A'_l\) で、\(A'_r\)\(1 - A'_r\) で置き換える操作と言い換えられます。\(S\) を自由に選ぶとき、\(A'_i = 1\) となる \(i\) の個数が同じであるような列は全て同じ個数ずつ生成されます。よって、\(A'\) における \(1\) の個数にのみ注目すればよいです。\(B\) に対応する \(B'\) を同様に定めたとき、\(B'\) における \(1\) の個数を \(C\) とおきます。

まず、同じ区間に対する操作を許し、操作を集合としてではなく選んだ区間の列として区別することにします。\(\mathrm{dp}_{i, j}\)\(i \, (0 \leq i \leq M)\) 回操作して \(A'\)\(j\) 個の \(1\) が存在するようにする方法の総数とおくと、これは \(O(NM)\) で計算することができます。

次に、\(A'\)\(C\) 個の \(1\) が存在するようにする操作列のうち、選んだ区間が全て異なるようなものの総数を包除原理によって求めます。 \(M\) 頂点のグラフを考え、\(i\) 個目と \(j\) 個目の区間が等しいことを頂点 \(i, j\) 間の辺によって表します。このグラフにいくつかの辺を張る \(2^{\frac{M(M - 1)}{2}}\) 通りの方法全てについて、以下の値の総和を求めればよいです。

  • 辺数を \(e\)、奇数頂点の連結成分の個数を \(s\)、偶数頂点の連結成分の個数を \( t\) としたとき、\((-1)^e \left(\frac{N(N + 1)}{2}\right)^t \mathrm{dp}_{s, C}\)

\(n\) 頂点の単純連結無向グラフのうち、辺数が偶数のものの総数から辺数が奇数のものの総数を引いた値は \((-1)^{n -1}(n - 1)!\) です(参考 : ABC236Ex 解説)。

\(n\) 頂点のグラフに辺を張って \(k\) 個の奇数頂点の連結成分が存在するようにする方法に対して \((-1)^e \left(\frac{N(N + 1)}{2}\right)^t\) を足し合わせた値を \(\mathrm{split}_{n, k}\) とおくと、これは次のような漸化式に従って計算できます。

  • \(\mathrm{split}_{n, k}\) の値が確定したら、次の処理を行う。
    • \(\mathrm{split}_{n + 2a, k}\)\((-1)^{2a - 1}(2a - 1)! \times \frac{N(N + 1)}{2} \times \binom{n + 2a - 1}{2a - 1} \times \mathrm{split}_{n, k}\) を足す。
    • \(\mathrm{split}_{n + 2a + 1, k + 1}\)\((-1)^{2a}(2a)! \times \binom{n + 2a}{2a} \times \mathrm{split}_{n, k}\) を足す。

遷移式の係数を整理すると、

\[\begin{aligned} (-1)^{2a - 1}(2a - 1)! \times \frac{N(N + 1)}{2} \times \binom{n + 2a - 1}{2a - 1} &= -\frac{N(N + 1)}{2} \times (n + 2a - 1) \times \dots \times (n + 1) \\ (-1)^{2a}(2a)! \times \binom{n + 2a}{2a} &= (n + 2a) \times \dots \times (n + 1) \end{aligned}\]

遷移によって \(n\) の値が \(0 \rightarrow s_1 \rightarrow \dots \rightarrow s_k = M\) と変化したとすると、途中で掛けられた \((n + a') \times \dots \times (n + 1)\) という形の式の総積は \(\frac{M!}{s_1 \times \dots \times s_m}\) となります。

一つの連結成分を確定させる遷移を複数回に分けて行うことを考えると、次のような漸化式で \(\mathrm{split'}\) を計算すると、\(\mathrm{split'}_{M, k} = \mathrm{split}_{M, k}\) となることがわかります。なお、全ての \(n\) に対し \(\mathrm{split'}_{n, k} = \mathrm{split}_{n, k}\) となるわけではありません。

  • \(\mathrm{split'}_{n, k}\) の値が確定したら、次の処理を行う。
    • \(\mathrm{split'}_{n + 1, k + 1}\)\(\mathrm{split'}_{n, k}\) を足す。
    • \(\mathrm{split'}_{n + 2, k}\)\(-\frac{N(N + 1)}{2} (n + 1) \mathrm{split'}_{n, k}\) を足す。
    • \(n + 2 \neq M\) なら、\(\mathrm{split'}_{n + 2, k}\)\((n + 2)(n + 1) \mathrm{split'}_{n, k}\) を足す。

\(\mathrm{dp}, \mathrm{split'}\) はそれぞれ \(O(NM), O(M^2)\) で計算できます。\(\displaystyle \sum_{k = 0}^M \frac{\mathrm{dp}_{k, C} \times \mathrm{split'}_{M, k}}{M! \times \binom{N + 1}{C}}\) が答えとなります。

posted:
last update: