競技プログラミング日記

主に AtCoder の記事です

AtCoder Regular Contest 135C

ARC135C

最終形の性質から考える. 操作を1回以上施した場合,帰納的に ある \(k \in N\) があって,任意の \(i \in N\) に対して \(a_{i}\) は \(a_{i} \oplus a_{k}\) の形. これは, \((x \oplus y) \oplus (z \oplus y) = x \oplus z\) であることから確かめられる. すなわち,操作を1回以上した場合は,操作を1回した場合に帰着できる. よって,操作は0 または 1回と仮定してよい.

実装
操作を全探索する. for \(x \in \{0\} \cup a \) as set に対して, \(s := \sum_{i \in N } a_{i} \oplus x\) を高速に求める. これは桁事に計算すればよい. 定数 \(K\) を,任意の \(i \in N\) に対して \(A_{i} < K\) となるようにとる. このとき, \(s = \sum_{k \in K} \sum_{i \in N} (a_{i} \oplus x \)の \(2^{k}\) の桁の和 \()\) . これは,前計算で \(k \in K, i \in N\) に対して \(a_{i}\) の \(2^{k}\) が \(1\) となる個数を求めておけば十分.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"