分析
位运算之谜
让我来口胡一把。首先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;
}
京公网安备 11010502036488号