这个函数是
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 ****************************************************************/