第k个格雷码为k xor (k>>1)的简单理解证明

蒟蒻今天刷到Codeforces的1163E,不会,看答案,要用到线性基和格雷码的构造法。
又去看了洛谷的P5657 [CSP-S2019] 格雷码,发现题解第一位的大神给出了一个极其巧妙的结论:第k个格雷码Gk = k xor (k>>1)(k从0数起),即 G_{k}= k \oplus \left \lfloor \frac{k}{2} \right \rfloor= k \oplus (k>>1)
大神原题解:
大神没有给出详细的证明,评论区也没看到证明,我在网上也找不到证明,于是自己证了一波(不会是前无古人吧,但我真的找不到其他人的证明了,百科上甚至没有这个结论,如果有前人的证明请告诉我,我信息检索能力不太行QWQ),并且给出一种可能的推出这个结论的思路(当然蒟蒻没有看到结论之前是想不出的QWQ)。

我们假设不知道这个结论,我们寻找一种结论来用k表示Gk。

首先考虑 G_{k} \oplus G_{k+1},这个式子必须只有一位为1。

我们进行分类讨论:

① 如果k的最低位为0,则k+1最低位为1,没有产生进位,此时要使式子只有一位为1,将k和k+1异或即可, G_{k} \oplus G_{k+1} = k \oplus (k+1) = 1

由这种情况我们可以假设 G_{k} = k,这在第一种情况成立,然而在第二种情况不成立。

② 如果k的最低位为1,则k+1最低位为0,此时发生了进位。

举个例子,

k = (110100111)_{2}

k+1 = (110101000)_{2}

则 k \oplus (k+1) = (000001111)_{2}

我们如何改进 G_{k} = k这个公式,使得这个公式既符合第一种情况又符合第二种情况呢?

只要把1111异或上0111就得到了1000。

我们容易发现 k \oplus (k+1)>>1 = (000000111)_{2} = (k>>1) \oplus ((k+1)>>1)

由异或运算的性质得到 k \oplus (k+1) \oplus (k>>1) \oplus ((k+1)>>1) = k \oplus (k>>1) \oplus (k+1) \oplus ((k+1)>>1) = (000001000)_{2}

 观察容易知道我们若设 G_{k}= k \oplus (k>>1),则符合第二种情况,同时也符合第一种情况。

这样就得到了这个符合全部情况的结论G_{k}= k \oplus \left \lfloor \frac{k}{2} \right \rfloor= k \oplus (k>>1)

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值