题目链接

https://ac.nowcoder.com/acm/contest/7412/D

解题思路

(来自:zzugzx)
对于二进制的某一位来说,a xor b表示不进位的加法,a & b<<1可以表示加法的进位。所以就有了公式a+b=a xor b+2∗(a & b)
通过这个公式可以直接计算(a xor b),但是需要排除两种不能被组成的情况:
一个就是计算出来的(a xor b)<0;另一个就是a & b和a xor b肯定是取反的,真值表可知除同为0的情况,其他情况下,二者永远相反,所以若不相反说明不存在a,b。
如果都满足说明给出的a+b和a&b可以被构成


我还是不明白为什么这两种特殊判断就是a,b不存在的充分必要条件。QWQ,WTCL!

AC代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read(){
    ll x=0,f=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch<='9' && ch>='0'){
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
ll t,x,y;
int main(){
    t=read();
    while(t--){
        x=read();
        y=read();
        ll z=x-2*y;
        if(z<0||y&z) cout<<-1<<endl;
        else cout<<z<<endl;
    }
}