• 分析

    位运算之谜
    让我来口胡一把。首先a+b的值为x,a&b的值为y,说明a,b最小都得是y。然后就只剩下x - 2 * y供我们分配。

    然后根据与的性质,0&0=0,0&1=0,1&1=1,也就是说,当我们把x - 2 * y表示成二进制,只要随便分这其中的1

就行了,比如说,14=8+4+2,我可以把8给a,4给b,2给a。但是什么情况是不合法的呢——(x - 2 * y < 0),另一种是

((x - 2 * y ) & y ) > 0。后者,当我们分配后,他们除了y中的几位,还会有其他位上同为1,不合法

  • 代码

#include<bits/stdc++.h>

#define ll long long

using namespace std;

int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        ll x,y;scanf("%lld%lld",&x,&y);

        ll rem=x-2*y;
        if(rem<0||(rem&y)) puts("-1");
        else printf("%lld\n",rem);
    }

    return 0;
}