The Harmonization of XOR

我们先将数字配对:对于1~n中的数i,如果ixn,则iix配对(显然这是来两两配对的),特别地,如果xn,则x单独为一组

Bx的最高位,M1~n中第B位为1的数字的集合,不难知道这些数字与x的异或小于n,而且上述配对一定要求配对中某一个数的第B位为1,也就是说我们可以将所有的配对表示成(ix,i),其中i是集合M的元素

对于任意一种合法的方案,任何一个集合中一定有至少一个数字的第B位为1,所以一定要求k不超过|M|;我们按上述配对方法配对,并将每个配对作为一个集合,如果1 ~ n中剩下的没有配对的数字的异或和为0,那么我们肯定可以找到一种方案,如下:显然k必须要为奇数并且1~n的异或和为x才可能有解,此时由于1 ~ n中剩下的没有配对的数字的异或和为0,那么配对数一定为奇数并且可以将剩下的没有配对的数字随意放到一个配对集合里面;由于三个配对集合可以合并成一个集合,而每次合并会让集合数目减少2,故此时可以一直合并知道集合数量为k

如果1~n中剩下的没有配对的数字的异或和不为0,我们来证明无解

假设我们已经找到了一组合法的解,考虑某一对在这组解中的位置,不妨认为这组解是(i,ix)

若这组解中,iix在同一个集合中,那么这个集合中剩下的数的异或和为0,我们将剩下的数拿出来作为一个新的集合(但是注意这个集合的异或和不是x而是0

若这组解中,iix不在同一个集合中,那么我们考虑他们各自在的两个集合中除了他们剩下的数;假如两者所在的集合分别为S1,S2,剩下的数的异或和分别为A,B,不难知道A=ix,B=i,于是我们将S1,S2变成两个新的集合{i,ix},{A,B},显然没问题

由以上过程可以知道,任何一种合法的解都可以变换为若干个集合,其中每个集合都形如{i,ix}或{x}或若干个{0}(最后一个集合是上面描述中第一种方法产生的集合),我们将若干个{0}合并成一个{0},这最后一个{0}就是1~n中剩下的没有配对的数字的异或和,故必须为0

当然上述做法只是对题解的一个严格证明,要做的话还是这么想:从构造题的角度我们尽量构造简单的集合,不要被题目所给的一个集合中有大于两个元素给迷惑了;从k的角度,由于题目要求刚好有k个,这比较难实现,所以我们考虑可能的最大集合数量并且利用异或和合并的性质进行缩小就好了

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