Official

C - Count Dividing XOR Editorial by maroonrk_admin


重要な観察として,\(A \oplus B \geq B-A\) が常に成り立ちます.これは,\(A,B\) から共通して立っている bit を全て除くとわかります.

\(A \oplus B\)\(A,B\) の両方を割り切るということは,\(B-A\) を割り切るということを意味し,\(A \oplus B \leq B-A\) が従います.

よって結局,\(B-A=A \oplus B\) が成り立ちます.

\(g=A \oplus B\) を固定すると,\(A\) として調べるべきは,\(L \leq A \leq R-g\) かつ \(g\)\(A\) を割り切るものだけです. これは高々 \((R-L)/g+1\) 個しかありません.

よって,\(1 \leq g \leq R-L\) を全て試しても,全体で \(O((R-L) \log (R-L))\) 個の候補しかありません. よってこれをそのまま実装すれば十分高速です.

解答例(C++)

posted:
last update: