XOR Break — Solo Version

这道题目就是纯纯的题面搞人心态,看到63次操作真的很容易想到从高位到低位一位位进行操作。然而正解却不是

先来看官解

首先每次操作只会将n变小,所以如果m>n,那么肯定无解;如果m=n那么不用操作;接下来假定m<n(其实题面给了m的范围,小于n

如果m最高位1n最高位1一样,那么直接令y=m,n=y即可

如果m最高位1n次高位1之后(也可以刚好在次高位1的位置),那么我们令y2b1,其中b是次高位1所在位置。比如n=1001000,则y=1111(相当于把次高位1及其后面的所有位全部变成1),然后令n=y。如果此时m=n那么不用再操作,否则的话m就变成了n的子集,很容易构造

如果m最高位1n最高位1n次高位1之间,那么此时无解,官方解答给出了一个reason,但是看不太懂。。。下面我会说我的证法

然后说说我的想法

很自然的一个想法就是从高到低地考虑,我们还是直接假设m<n

如果m最高位1对应的n的位为1,那么令y=m,n=y即可

如果m最高位1对应的n的位为0,那么我们考虑n比这更高的位的1的个数

如果1的个数超过一个,那么我们任取其中两个1,令更高位的1所对应的位置赋0,更低位的1所对应的位置赋1,然后再将m最高位的1的位置赋1,然后把刚刚得到的数令成y,然后令ny异或,这样m就变成了n的子集了

如果1的个数只有一个,那么此时无解,因为如果有解,那么对某种操作序列,一定会存在某次操作,将m的最高位所对应的n的位置变成1,即ym的最高位这里要取1,根据题目,此时yn的最高位无论取1还是0都是不行的(假设此次操作的时候,n的更高位仍然只有一个1),所以我们一定会在这种操作的前面将n的更高位变成两个1,相当于就是将n的某一位0变成1,其实就是上面的过程,然后你会发现就循环论证了,所以不可能

posted @   最爱丁珰  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示