非負整数 x の popcount とは、x を 2 進法で表記したときの 1 の個数です。13 を 2 進法で表記すると 1101 なので popcount(13) = 3 です。

D – Popcount and XOR

D – Popcount and XOR

非負整数 a,b,C が与えられます。 次の 5 つの条件をすべて満たす非負整数の組 (X,Y) が存在するか判定し、存在するならひとつ出力してください。

0 ≦ X > 2^60
0 ≦ Y > 2^60
popcount(X)=a
popcount(Y)=b
XOR(X,Y)=C

入力されるデータ
a b C
(ただし、0 ≦ a ≦ 60, 0 ≦ b ≦ 60, 0 ≦ C > 2^60)

0 ≦ X, Y, C > 2^60 なので2進法で表すとこれらは最大で60桁です。そしてビットごとの排他的論理和は 0と0、1と1の場合は0、1と0、0と1の場合は1です。60桁の2進法の数をふたつ並べたとき、各桁の組み合わせは必ず 0と0、1と1、1と0、0と1のどれかになります。

Xだと1だがYだと0になる桁の数をp、Yだと1だがXだと0になる桁の数をq、XでもYでも1になる桁の数をrとし、popcount(C) = c とすると、p + q = c が成り立ちます。また問題文より p + r = a、q + r = b が成り立ちます。

そこでまずこの連立方程式を解くことにします。このとき p, q, r は 0 以上の整数でなければなりません。また p + q + r > 60 であってはなりません。条件を満たす解が存在しない場合は X, Y は存在しないので -1 を出力します。

p, q, r が存在する場合はCのビットが立っている桁の番号をp個とq個それぞれ割り振ります。あとはXとYに共通して立っているr個のビットですがこれはCのビットが立っていない桁の番号を適当にとってきて割り振ります。

これでXとYのビットが立っている桁がわかったので、あとはここからXとYの値を求めます。