题解 -
题目意思
-
给你一个区间 ,求
-
贪心+位运算
-
我们首先考虑异或的性质,即二进位不同才能产生贡献。
-
那么我们就有了个很简单的想法就是在保持上下界的情况从高位向低位取(即强制让某些位不同)。
-
还有的就是细节问题,具体看代码。
#include <bits/stdc++.h>
#define For(i,a,b) for ( int i=(a);i<=(b);i++ )
#define Dow(i,b,a) for ( int i=(b);i>=(a);i-- )
#define GO(i,x) for ( int i=head[x];i;i=e[i].nex )
#define mem(x,s) memset(x,s,sizeof(x))
#define cpy(x,s) memcpy(x,s,sizeof(x))
#define YES return puts("YES"),0
#define NO return puts("NO"),0
#define GG return puts("0"),0
#define pb push_back
#define int long long
using namespace std;
inline int read()
{
int sum=0,ff=1; char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-') ff=-1;
ch=getchar();
}
while(isdigit(ch))
sum=sum*10+(ch^48),ch=getchar();
return sum*ff;
}
const int mod=1e9+7;
const int mo=998244353;
const int N=1e5+5;
int a,b,bit[66],Bit[66],ans,all;
signed main()
{
a=read();
b=read();
if(a==b) GG;
if(a>b) swap(a,b);
Dow(i,63,0)
if((b>>i)&1ll) bit[i]=1;
Dow(i,63,0)
if((a>>i)&1ll) Bit[i]=1;
int flg=0,OK=0;
//OK保证满足下界,flg保证满足上界
Dow(i,63,0)
{
if(Bit[i]&&!OK)
{
if(all) ans+=(1ll<<i);
continue;
}
if(!bit[i]&&all)
ans+=(1ll<<i),OK=1;
if(bit[i])
{
if(!Bit[i]) all=1,ans+=(1ll<<i);
if(Bit[i]) ans+=(1ll<<i);
}
}
printf("%lld\n",ans);
return 0;
}