首先考虑将十进制转化为二进制的写法
例题1:
对于异或类型的题目,考虑将数字转化成二进制,为了使|(a⊕x)−(b⊕x)|最小,先想一种极端情况,如果a=b那么答案就为0,从中可以发现,当两个数越接近,那么两个数的差就越小。
做法:假设a<b ,if not (swap),从高位到低位一一枚举,如果bit_a为0,bit_b为1,那么异或一下,x+(1<<i),(判断是否超r),此时a的数值变大,b的数值变小,那么两个数接近了。(记住:第一位不同的不要动,保持a<b)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,r;
int maxn=60;
bool bt(int x,int i){
return x&(1ll<<i);
}
void solve(){
cin>>a>>b>>r;
if(a>b)swap(a,b);
bool flag=false;
int x=0;
for(int i=maxn-1;i>=0;i--){
int bit_a=bt(a,i);
int bit_b=bt(b,i);
if(!flag&&bit_a!=bit_b){
flag=true;
}
else if(bit_a!=bit_b){
if(!bit_a&&x+(1ll<<i)<=r){
a^=(1ll<<i);
b^=(1ll<<i);
x+=(1ll<<i);
}
}
}
cout<<b-a<<"\n";
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}