Codeforces Round 922 (Div. 2)
https://codeforces.com/contest/1918/problem/C
首先使a>b,从左往右找到第二个a和b不同的位置,(第一个位置不交换,为了保证a>b,之后的结果可以统一找每一位使a>b,而达到结果最优。)
找的方法即为如果一个位置上a为1,b为0,那么x此时的位置为1,与 x 异或之后,a变为0,b变为1,相减后会使结果减小,如果 a b 位置上相等,则不影响结果。
进制相减的时候,转化为10进制,再相减,即找到的位置为第 n 位,则a - = 2^n-1, b + = 2^n-1,
注意:找位置的时候,a>>i&1的时候要加上括号,由于 & 的运算符优先度低。
#include
using namespace std;
typedef long long ll;
typedef pair pii;
const int N = 2e5+5;
const int inf = 0x3f3f3f3f;
ll a,b,r;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--){
cin>>a>>b>>r;
if(a=0;i--){
if((a>>i&1)!=(b>>i&1)){
x=i;
break;
}
}
ll ans=0;
for(int i=x-1;i>=0;i--){
ll cnt=1;
for(int j=0;j>i&1)==1&&(b>>i&1)==0&&ans+cnt<=r){
ans+=cnt;
a-=cnt;
b+=cnt;
}
}
cout<