2020年9月14日月曜日

CodeChef September Challenge 2020 - Find XOR

仮にK=0K=0を尋ねることが可能だとすると、K=0K=0による総和とK=2eK=2^eによる総和の差は(Ai)(A_i)の中で第eeビットが11であるものの総数-第eeビットが00であるものの総数に等しい。これを利用すると各桁の立っているビットの数がわかるので、偶数ならXORを0、奇数なら1とすればよい。

実際にはK1K\ge1という制約があるが、代わりに全ビットを反転したもの(=22012^{20}-1とXORを取ったもの)をKKとすれば同じことができる。

また、素朴にやるとK=0,20,21,...,219K=0, 2^0, 2^1, ..., 2^{19}を全部尋ねる必要があってクエリの回数が21回になってしまう。K=20,...,218K=2^0, ..., 2^{18}を調べてK=0K=0の場合の生の総和と比較することで、K=219K=2^{19}は省略できて20回になる。


N103<210N \le 10^3 < 2^{10}だから、11ビットくらいで区切れば2つの質問を1つのクエリでできそうと思ったが、分離がかなり複雑になりそうなので方針を変えた。