第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)G-Xor Transformation

题目

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 0A<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

即可

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值