蒟蒻今天刷到Codeforces的1163E,不会,看答案,要用到线性基和格雷码的构造法。
又去看了洛谷的P5657 [CSP-S2019] 格雷码,发现题解第一位的大神给出了一个极其巧妙的结论:第k个格雷码Gk = k xor (k>>1)(k从0数起),即
大神原题解:
大神没有给出详细的证明,评论区也没看到证明,我在网上也找不到证明,于是自己证了一波(不会是前无古人吧,但我真的找不到其他人的证明了,百科上甚至没有这个结论,如果有前人的证明请告诉我,我信息检索能力不太行QWQ),并且给出一种可能的推出这个结论的思路(当然蒟蒻没有看到结论之前是想不出的QWQ)。
我们假设不知道这个结论,我们寻找一种结论来用k表示Gk。
首先考虑 ,这个式子必须只有一位为1。
我们进行分类讨论:
① 如果k的最低位为0,则k+1最低位为1,没有产生进位,此时要使式子只有一位为1,将k和k+1异或即可, 。
由这种情况我们可以假设 ,这在第一种情况成立,然而在第二种情况不成立。
② 如果k的最低位为1,则k+1最低位为0,此时发生了进位。
举个例子,
则
我们如何改进 这个公式,使得这个公式既符合第一种情况又符合第二种情况呢?
只要把1111异或上0111就得到了1000。
我们容易发现
由异或运算的性质得到
观察容易知道我们若设 ,则符合第二种情况,同时也符合第一种情况。
这样就得到了这个符合全部情况的结论