题目链接
思路
比赛时思路是把x分两步变成y,第一步是把x二进制中与y重合的部分异或成和y一模一样的,第二步是把多出y的那一部分全部异或成0,这样就能保证每一次异或的都比当前x小。
之后看到题解,做法更简单。首先y=0,因此x⊕y=x。
如果x⊕y<x,答案就是x⊕y。
否则只存在x⊕y>x,根据异或运算的自反性x⊕y⊕x=y,答案就是x⊕y和x。
异或运算的性质
- 交换律
- 结合律
- 自反性(x⊕y⊕x=y)因此可以用异或来交换两个数的值:
x=x⊕y=x1⊕y⇒原先的x称之为x1y=x⊕y=x1⊕y⊕y=x1x=x⊕y=x1⊕y⊕x1=y
- x⊕x=0,x⊕0=x
- 若x⊕y=z,则x⊕z=y
- x⊕−1=∼x
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x,y;
int main()
{
cin>>x>>y;
if((x^y)<x)
{
cout<<1<<endl;
cout<<(x^y)<<endl;
return 0;
}
cout<<2<<endl;
cout<<y<<" "<<x<<endl;
}