牛客小百月赛 28 -- 位运算之谜

链接:https://ac.nowcoder.com/acm/contest/7412/D
来源:牛客网

题目描述

a+ b的值为xa&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{}tx,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;
}
原文地址:https://www.cnblogs.com/Li-ningning/p/13698049.html