这个函数是
f(x) = (a ⊕ x) − (b ⊕ x)
我们要让函数尽可能大,那么就是让(a ⊕ x)尽量大的同时(b ⊕ x)尽量小。
对于二进制下a和b的每一位,只有四种情况,相同时x大小无所谓,不同时,
a 0
b 1 时x对应位为1;
a 1
b 0 时x对应位为0;
使f(x)最大的x就确定了,带进去求一下就是答案。
#include<bits/stdc++.h>
using namespace std;
long long vis[101],cnt;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
long long a,b,c=1,ans=0;
cin>>a>>b;
long long x=a,y=b;
while(a || b)
{
long long ax=a&1,bx=b&1;
if(ax==0 && bx==1) vis[++cnt]=1;
else vis[++cnt]=0;
//cout<<ax<<' '<<bx<<' '<<vis[cnt]<<endl;
a>>=1;
b>>=1;
}
for(int i=cnt;i;--i)
{
ans=(ans<<1)+vis[i];
//cout<<vis[i];
}
cout<<(x^ans)-(y^ans);
return 0;
}
/**************************************************************
Problem: 4564
User: contest21_42
Language: C++
Result: 正确
Time:2 ms
Memory:2180 kb
****************************************************************/


京公网安备 11010502036488号