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問題のものにしてしまったのは秘密です