链接:https://ac.nowcoder.com/acm/contest/7412/D
来源:牛客网
题目描述
a+ b的值为x,a&b的值为y,首先需要判断能否有一组a,b满足当前的情况,如果有,那么求出a xor b,否则输出−1
输入描述:
第一行为一个正整数t,表示组数第一行为一个正整数t,表示组数{}第一行为一个正整数t,表示组数
(t<=2×105)(t<=2×10^5)(t<=2×105)
接下来t行,每一行有两个整数x,y接下来t行,每一行有两个整数x,y{}接下来t行,每一行有两个整数x,y
(0<=x,y<=1×1018)(0<=x,y<=1×10^{18})(0<=x,y<=1×1018)
输出描述:
对于每一组数据,按题意输出a xor b或者-1
示例1
输入
1 2 1
输出
0
示例2
输入
1 2 2
输出
-1
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll solve(ll x ,ll y)///这个函数真的是太精了,我也是赛后看别人的,我当时用补位的想法一直wa { if(x < 0) return -1; if((x&y)) return -1;//// 有冲撞位 , & 出来肯定不是0,所以返回-1 , 我这里说的冲撞位, 是指同1的位,就是冲撞的 return x;/// 符合条件,没有冲撞位,为什么是返回 x , 因为x跟y没有冲撞位,刚好x的1和y的1全都错开了,异或出来也是 x } int main() { int a ; ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>a; while(a--){ ll a , b ; ll x,y; cin>>x>>y; a = y; x = x-y*2; cout<<solve(x,y)<<endl; } return 0; }