D - Popcount and XOR 解説 by rsk0315

素朴な方針

\(C = \sum_{i=0}^{59} 2^i\cdot c_i\) (where \(c_i\in\{0, 1\}\)) とします。 このとき、\(c_i = 0\) であるような \(i\) の集合を \(S_0\)\(c_i = 1\) であるような \(i\) の集合を \(S_1\) とします。

\(S_0\), \(S_1\) の部分集合のうち要素数が \(p\) 個, \(q\) 個のもの(のうち任意に固定したもの)を \(S_0^p\), \(S_1^q\) とおきます。 このとき、下記のように \(x\), \(y\) を定義します。

\[ \begin{aligned} x &= \sum_{i\in S_0^p\vee S_1^q} 2^i, \\ y &= \sum_{i\in S_0^p\vee(S_1\smallsetminus S_1^q)} 2^i. \end{aligned} \]

構成から、\(x\oplus y = C\) となることはわかります。 すなわち、\(S_0^p\)\(S_1^q\) の選び方によって \(x\oplus y\) が変わることはありません。 また、xor の性質から、上記以外の選び方で \(x\oplus y = C\) となることはありません。

よって、\(p\), \(q\)\(0\) 以上 \(60\) 以下の範囲で全探索し、popcount に関する条件を調べればよいです。


実装例においては、\(S_0^p\) を考える代わりに、「\(S_0\) のうち値が \(i\) 以下のもの」を使っています(\(S_1^q\) も同様)。

提出 #51955920

実際には、\(p\), \(q\) は一意(存在しないか、存在すれば一通り)なので、二重ループの部分は削ることができます。

投稿日時:
最終更新: