RT,赛时拍了几十组都没错,求调或hack
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,x;
int an[100],ax[100];
int cntn,cntx;
int t;
int ans[100];
int ans1;
void solve(){
cntn=cntx=0;
memset(ax,0,sizeof(ax));
memset(ans,0,sizeof(ans));
memset(an,0,sizeof(an));
scanf("%lld%lld",&n,&x);
if(n==x){
printf("%lld\n",n);
return;
}
ans1=0;
int n1=n,x1=x;
while(n1){
an[++cntn]=n1%2;
n1/=2;
}
while(x1){
ax[++cntx]=x1%2;
x1/=2;
}
if(x==0){
printf("%lld\n",1ll<<cntn);
return;
}
if(x>n){
printf("-1\n");
return;
}
int cntx1=cntx;
for(int i=cntx1+1;i<=cntx1+cntn-cntx1;i++){
ax[++cntx]=0;
}
//for(int i=1;i<=cntn;i++) printf("%d ",an[i]);
//puts("");
//for(int i=1;i<=cntx;i++) printf("%d ",ax[i]);
for(int i=1;i<=cntn;i++){
if(ax[i]==1&&an[i]==0){
printf("-1\n");
return;
}
if(ax[i]==0&&an[i]==1){
ans[i]=0;
}
if(ax[i]==1&&an[i]==1){
ans[i]=1;
}
}
for(int i=cntn;i>=1;i--){
if(ans[i]==0&&an[i-1]&&ax[i-1]==0){
ans[i]=1;
break;
}
}
for(int i=cntn;i>=1;i--){
ans1+=ans[i];
ans1*=2;
}
//printf("%lld\n",cntx1);
cntn=cntx=0;
memset(ax,0,sizeof(ax));
memset(an,0,sizeof(an));
int ans2=x==0?ans1:ans1/2;
bool fg2=0;
int j=0;
ans1=0;
int sum=n;
/*for(int i=n;i<=ans2;i++){
j++;
if(j>500) break;
if(!sum&&x!=0){
fg2=1;
break;
}
}*/
printf("%lld\n",ans2<n||fg2?-1:ans2);
ans1=0;
}
signed main(){
scanf("%lld",&t);
while(t--){
solve();
}
return 0;
}