ABC121 D - XOR World
解法
についてxorを取るとき、についてxorを取った結果と、についてxorを取った結果の2つの数字について、改めてxorを取ればよいです。ということで、の区間の数字についてxorを取った結果を求めていく方法を探ります。
これは、それぞれの桁について、xorを取った最終的な結果が1か0かを計算し、最後に加算していけばよいです。
の桁についてみた時(ただし、 とします)、0から順番にビットを見ていくと、これはまでで1回ループをします。
ではビットが0、ではビットが1になっています。
そして、この1回のループでは、ビットが立っている数の個数が個なため、xorをとると0になります。
ということで、まずはをで割った余りをとしたとき、についてのみ考えればよいことがわかります。
あとは、上記の区間についてビットが立っている個数を調べればよく、
以上しかビットが立っていないことから、
からを引いた結果が奇数ならばこの桁の最終的な結果は1、偶数なら0、となります。
そして、の場合ですが、これは4つ数字が増えるごとに1回ループをします。
ということで、4で割った余りが1か2であれば答えは1、そうでなければ0となります。
これを、について操作を行い、それぞれの結果について改めてxorを取れば、答えとなります。
感想
今回は後ろから読んだため、最初に解いた問題となりました。
やりたいことはすぐに浮かんでいたのですが、ボケっとしていたら、引き算をする値や割り算をする値を間違えたり、コーナーケースであるの部分にひっかかったりしました。
ただ、WAを出さずにそこそこの速度で通せたので、満足です。
後ろから解いていたので、提出コードのリンクを間違えてA問題のものにしてしまったのは秘密です