公式

E - Shift and XOR Switches 解説 by yosupo


実は押すスイッチの集合が同じならば、それらを押す順番は最終的な \(B\) を変化させない。押されたスイッチに書かれた値を \(C_1, C_2, \cdots, C_K\) とする。このとき

  • \(B_i\) とは \(C_i\) からいくつか選んで \(i\) を作る通り数の偶奇である。あるいは
  • \(\mathbb F_2\) 上の多項式として\(B = \prod{(1 + x^{C_i})} \pmod {x^{N}}\)

\(B\) は解釈することができる。どちらの解釈でもスイッチを押す順番は最終的な \(B\) に影響を与えないことが分かる。

これに加え、重要な事実が \(2\) つある。\(1\) つめは以下である。

  • \(X\) が書かれたスイッチを \(2\) 個押すのと、\(2X\) が書かれたスイッチを \(1\) 個押すのは等価である

正当性は \((x + 1)^2 = x^2 + 1 \pmod 2\) を考えればよい。この変換を繰り返すことで、押すスイッチの値の集合をdistinctになるように変換可能である。

そして \(2\) つめの重要な事実は以下である。

  • もし押すスイッチの値が distinct であることが分かっているならば、生成された \(B\) からスイッチの値の集合が復元可能である

これは以下を繰り返せばよい。

  • \(B_i = 1\) なる最小の \(i\) から、押したスイッチの値の最小を求める
  • 「もしこのスイッチを押さなかったらどうなるか」をFPS除算(戻すDP)により計算する

この \(2\) つの事実は「押すスイッチの値がdistinctになるように変換したあとの集合が、最終的な \(B\) を特徴づける」ということを示唆する。つまり、この問題は以下のように言い換えられる。

  • \(A\) からいくつかの要素を選び、\(C\) とする
  • \(C\) に同じ値 \(x\)\(2\) つ以上存在するならば、これを \(2\) つ取り除き、代わりに \(2x \lt N\) ならば \(2x\) を追加する
  • この操作を可能な限り繰り返したとき、最終的に出来る集合は何通りあるか?

この問題を考える。まず、\(A\) の値を奇数部分、つまり \(A_i\)\(2\) で割れるだけ割ったあとに残る値、で分類してよいことが分かる。それぞれを独立に解けばよい。

分類後の問題は、 \(1, 2, 4, 8, ..., 2^{L-1}\) がいくつかあるので、これの総和として出来る値のうち \(2^{L}\) 以下のものは何種類か? という問題になる。

最終的な値を固定したときに、それが達成可能か、という判定問題を考える。これは貪欲法で解くことが可能である。実際に下のbitから見ていき、\(1\) ならば対応するスイッチを \(1\) つ使う。そして、余ったスイッチを全て \(2\) 個組にして、\(2\) 倍の値のスイッチへ変換する。

この貪欲法を元に、最終的な値を下のbitから決めていく桁DPが実装可能である。伝搬するスイッチの個数が桁ごとに高々 \(2\) 種類しかないのが重要であり、\(O(L)\) 時間で動く。

\(L\) の合計は \(N\) であるため、合計で \(O(N + M)\) 時間でこの問題を解くことができる。

投稿日時:
最終更新: