Official

A - Smaller XOR Editorial by maroonrk_admin


\(x\)\(2\) 進表記したときに \(1\) になっている最大の位が \(2^k\) の位だったとします. \(N\)\(2\) 進表記したときに \(2^k\) の位が \(0\) であった場合,\(N \oplus x > N\) であり,逆に \(2^k\) の位が \(1\) であった場合は \(N \oplus x < N\) です.

よって,\(N\)\(2\) 進表記したときに \(2^k\) の位が \(1\) であるようなすべての \(k\) について,\(L \leq x \leq R\) であって,かつ \(x\)\(2\) 進表記したときに \(1\) になっている最大の位が \(2^k\) であるような \(x\) の個数を求めればよいです.

ここで,後者の条件は \(2^k \leq x < 2^{k+1}\) と書きなおすことができるため,結局 \(x\) の条件は \(\max(L,2^k) \leq x \leq \min(R,2^{k+1}-1)\) となり,簡単に数えることができます.

\(k\) の候補が \(O(\log N)\) 個あるため,計算量は全体で \(O(\log N)\) です.

posted:
last update: