题解 CF76D 【Plus and xor】
badFlamesへ
·
2020-11-22 12:27:45
·
题解
题解 CF76D
这是一道不错的位运算性质题。
我们先来了解几个柿子(可以下去自己推推看):
(此处\operatorname{and} 为按位与,\operatorname{or} 为按位或,\operatorname{xor} 为按位异或)
$a+b=a\operatorname{or}b+a\operatorname{and}b=a\operatorname{xor}b+2\times (a\operatorname{and}b)$ (2)
------------
我们发现,题目中告诉了我们 $x+y$ 和 $x\operatorname{xor}y$ 的值
那么自然而然地, $x\operatorname{and}y$ 的值就是可求并且是固定的了
考虑在 $x+y$ 中,要使 $x$ 的值最小,就让 $x$ 在 $x\operatorname{and}y$ 中的“贡献”尽量少
对于 $x\operatorname{and}y$ 的每一位,若当前位位 $1$ ,则 $x,y$ 的对应位上的值都必须为 $1$ ,否则就让 $x$ 的为 $0$ , $y$ 的为 $1$(因为$x$要尽量小)。
所以 $\min x=x\operatorname{and}y
那么 y=x+y-(x\operatorname{and}y)
那什么时候无解呢?
考虑公式(2),因为 a\operatorname{and}b 的值为正整数,所以如果 A-B 为奇数则无解
同样,A<B 时也无解
\text{\color{Red}注意数据范围!!!!!}
代码奉上
unsigned long long a, b, d;
signed main() {
cin >> a >> b;
d = a - b;
if(d < 0 || d & 1) puts("-1");
else {
cout << d / 2 << ' ' << a - (d / 2);
}
return 0;
}