链接:https://ac.nowcoder.com/acm/contest/7412/D
来源:牛客网
a+b的值为x,a&b的值为y,首先需要判断能否有一组a,b满足当前的情况,如果有,那么求出a xor b ,否则输出−1
(其中a,b>0)
输入描述:
第一行为一个正整数t,表示组数第一行为一个正整数t,表示组数{}第一行为一个正整数t,表示组数
(t<=2×1e5)
接下来t行,每一行有两个整数x,y接下来t行,每一行有两个整数x,y接下来t行,每一行有两个整数x,y
(0<=x,y<=1×1e18
输出描述:
对于每一组数据,按题意输出a xor b或者-1
示例2
输出
复制-1
做这个题之前要知道一些位运算公式,
对于二进制的某一位来说,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和a xor b肯定是相反的,
a b a&b a xor b
1 1 1 0
1 0 0 1
0 1 0 1
#include<iostream> #include<algorithm> using namespace std; /* a+b的值为x,a&b的值为y,首先需要判断能否有一组a,b满足当前的情况,如果有,那么求出a xor b,否则输出-1 (其中a,b>0) */ typedef long long ll; int main(){ int t; cin>>t; while(t--){ ll a,b; cin>>a>>b; if((a-2*b)<0||((a-2*b)&b)){ cout<<-1<<endl; } else{ cout<<a-2*b<<endl; } } }