XOR World

ABC121-D "XOR World"

提出コード

atcoder.jp

考察

着目したのは以下の性質です.

任意の偶数 nに対して, n \oplus (n+1) = 1

大雑把な証明をしておきます.

任意の偶数 nに対して, nの最下位ビットは 0です.

一方で n+1を考えると,最下位ビットが 1で,その他のビットは nと等しいです.

よって, n n+1のXORをとると 1になることがわかります.


上の性質を用いると, Aから Bの中に偶数から奇数に切り替わるタイミングが何回あるか(numとおきます)を考えることで計算量を大幅に小さくできます.

また,num回の 1のXORについて,numが奇数であれば 1になり,numが偶数であれば 0になります.


私は Aが偶数か奇数か, Bが偶数か奇数かの 4通りの場合分けをしました.

(i)  Aが奇数で, Bが奇数

 A+1から Bまでが繰り返し部分で,num =\frac{B-A}{2}です.

つまり,num回だけ 1をXORした後,余った AをXORすればOK.

(ii)  Aが奇数で, Bが偶数

 A+1から B-1までが繰り返し部分で,num =\frac{B-A-1}{2}です.

つまり,num回だけ 1をXORした後,余った A BをXORすればOK.

(iii)  Aが偶数で, Bが奇数

 Aから Bまでが繰り返し部分で,num =\frac{B-A+1}{2}です.

つまり,num回だけ 1をXORするだけでいいです.

(iv)  Aが偶数で, Bが偶数

 Aから B-1までが繰り返し部分で,num =\frac{B-A+1}{2}です.

つまり,num回だけ 1をXORした後,余った BをXORすればOK.

以上により, O(1)で解けました.

感想

久しぶりの精進ツイートです.新生活でバタバタしていました.

この問題のdiffは 1164ですが,今この問題が出たら 800ぐらいな気がしますね.

模範解答がきれいすぎて感動しました笑