首先:不要直接输出pow()的值,会有bug
题目大意
就是解一个方程:a−(a⊕x)−x=0 (a已知)
解题思路
a−(a⊕x)−x=0 <> a−(a^x)−x=0 <> x^a = x-a
如果运算符 ‘^’与 ‘-’起到相同的效果的话就是一个解
分析四种比较;
1^1=0 1-1=0
1^0=1 1-0=1
0^0=0 0-0=0,
0^1=1 0-1=-1
当a的二进制表示,如果这个位是1,则x对应的二进制对应的位数是0或者1都行;如果这个位是0,则x对应的二进制对应的位数只能是0。
所以,a的二进制表示有几个1就有2的几次方的情况。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e6 + 7;
//char str[maxn][maxn];
int a[maxn],b[maxn],c[maxn];
priority_queue <int,vector<int>,greater<int> > q;
int main(){
int t;
cin >> t;
while(t--){
ll x;
ll sum = 0;
cin >> x;
while(x){
if(x&1){
x/=2;
sum++;
}
else {
x/=2;
}
}
//直接输出wa了几发
int ans = pow(2,sum) ;
printf("%d\n",ans);
}
return 0;
}