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))\) 個の候補しかありません. よってこれをそのまま実装すれば十分高速です.
posted:
last update: