题目链接
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; } }