CF76D Plus and xor 题解

· · 题解

题目主要与加、异或两种运算有关,那么我们就先把两种运算的计算方法列出来。

1,1 1,0 0,1 0,0
0(进一位) 1 1 0
异或 0 1 1 0

可以发现只有在两数当前位均为一时,加法进一位,异或不进位,其他时候两种运算计算方法是相同的。

所以,由于题目中说 A 为两数和,B 为两数异或的结果,那么 (A-B) 就是由进位产生的。因此若 (A-B) 的二进制表示中第 k 位是 1,那就意味着原来的 XY 的第 k-1 位均为 1

对于 X,我们希望它最小,现在对 X 的限制只有上述的两数均为 1 的情况,又因为当 B 的某一位为 1 时,让 X 此位为 0Y 此位为 1 即可。所以 X 的最小值为 (A-B) 左移一位,即 \frac{A-B}{2},而 Y 就是 A-X 了。

那么什么时候无解呢?由于输出格式中讲到 XY 均为正整数,所以当 A<B(A-B) 为奇数时没有符合要求的答案,输出 -1 即可。

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    unsigned long long int a,b;//坑点
    cin>>a>>b;
    if(a>=b && (a-b)%2==0) cout<<(a-b)/2<<' '<<a-(a-b)/2;
    else cout<<-1;
}