题解 CF1554C【Mikasa】
Blunt_Feeling · · 题解
CF1554C Mikasa 题解
题意是让我们找出最小的一个自然数
由于不可能一个一个枚举,所以这道题要用到异或的一些性质。设
根据这个性质,为了使
从高位到低位一位一位构造,对于第
Code
#include<bits/stdc++.h>
#define For(i,a,b) for(register int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(register int i=(a);i>=(b);--i)
using namespace std;
int T,n,m,k;
int main()
{
cin>>T;
while(T--)
{
cin>>n>>m;
bool flag=false;
k=0; m++; //别忘了++
Rep(i,31,0)
{
if(!flag&&(n&(1<<i)||m&(1<<i))) flag=true; //标记表示遍历到了有效位
if(!flag) continue;
if(n&(1<<i))
{
if(m&(1<<i)) k<<=1; //左移一位表示后面添上一个0
else
{
Rep(j,i,0) k<<=1; //后面几位都是0
break; //可以输出了
}
}
else
{
if(m&(1<<i)) k=(k<<1)|1; //先左移,再或一下,表示后面添上一个1
else k<<=1; //左移一位表示后面添上一个0
}
}
cout<<k<<endl;
}
return 0;
}
记得点赞哦~