题目
MianKing has one integer X X X, he wants to perform some operations to transform X X Xto Y Y Y ( Y < X ) (Y<X) (Y<X)In each operation, MianKing can choose one integer 0 ≤ A < X 0\leq A<X 0≤A<X and let X = X x o r A X=X~xor~A X=X xor A.It’s noticed that after an operation, the upper bound of A A A will change because X X X has changed. Now you need to help MianKing to find a way to transform X X X to Y Y Y by doing at most 5 5 5 operations.
题目
给两个 1 0 18 10^{18} 1018内的数 X X X和 Y Y Y,每次 X X X可以异或一个小于 X X X的数,每次 X X X改变以后异或的值的上限就变成了新的 X X X,求出五步以内把 X X X变成 Y Y Y的可行解
思路
由于:
X ^ L ^ X = L
L ^ L ^ Y = Y
所以需要找出一个L,满足L ^ X < X
找出比X高一位的那个数,把它减去1, 这个数就变成和X一样位数的一个数,且它的值一定大于等于X 这样的话
我们就能保证L ^ X 一定小于X 这样我们得到的就是 X ^ L ^ X = L
而L又是大于等于X 的,Y小于X 所以L ^ Y 小于L
至此,我们就找到了需要求出的L
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define moxiaobai false
#define plog if(moxiaobai) cout
int main()
{
ll x,y;
cin>>x>>y;
ll l = 1;
while(l<=x) l<<=1;
plog<<l<<endl;
l--; // 保证l小于x
cout<<2<<"\n";
cout<<(l^x)<<" "<<(l^y); // x ^ l ^ x = l 而 l 是大于等于x的 而 l ^ y 肯定小于 l 所以可行
}
小技巧:
#define moxiaobai true
#define plog if(moxiaobai) cout
这样调试的时候我们就能写
plog<<l<<endl;
当我们要交题的时候 只需要把上面改成
#define moxiaobai false
#define plog if(moxiaobai) cout
即可