分析
位运算之谜
让我来口胡一把。首先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; }