题目:
给定一个X和Y,对于X每次可以选择一个A(0<=A<X),使得X = X xor A,现在要求在5步内将X变为Y,请输出操作数目,以及每步的A
题解:
我一开始被题目给的样例个迷惑了,以为将Y分解开,然后再加一步X就可以了,但发现想复杂了
对于W = (X ^ Y),也就是W,X,Y任意两个xor等于第三
如果W 等于 X,说明Y是0,但因为Y>=1,所以该情况不存在
如果W小于X,那么我们第一步直接选W不就完事了,X ^ W = Y
如果W大于X,那就不能直接选W了,为了得到Y,我们可以先xorY,再xorX,因为第一步得到W,W大于X,所以可以选X,再选X相当于把一开始的X抵消了,只剩下Y
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int main()
{ ll x,y;cin>>x>>y;ll w=(x^y);if(w<x){cout<<1<<endl;cout<<w<<endl;}else {cout<<2<<endl;cout<<y<<" "<<x<<endl;}
}