连续数字异或和

求[1,n]所有数的异或和

如果加以打表,我们会发现其异或和有一定的规律

我们设f(x,y)表示区间[x,y]的异或和
那么有
对于k>=1
\(f(2^k,2^{k + 1} - 1)\)中,最高位\(2^k\)的1出现了\(2^k\)次,异或和为0,所以最高位可以去掉
\(f(2^k,2^{k + 1} - 1) = f(2^k - 2^k,2^{k + 1} - 1 - 2^k) = f(0,2 ^ k - 1)\)
所以
\(f(0,2^{k + 1} - 1) = f(0,2^k - 1) Xor f(2^k,2^{k + 1} - 1) = 0\)

由此,对于所有\(k>=2\),有\(f(0,2^k - 1) = 0\)
所以,对于\(f(0,n)\),设其最高位为\(2^k\)
那么\(f(0,n) = f(0,2^k - 1) Xor f(2^k,n) = f(2^k,n)\)
\([2^k,n]\)中,最高位出现的次数取决与n的奇偶

1、若n为奇数,那么最高位出现了\(n + 1\)次为偶数,可以去掉
\(f(2^k,n) = f(0,n - 2^k)\),可以发现\(n - 2^k\)与n具有相同的奇偶性,可以利用同样的推导去掉
最后\(f(0,n)\)的就取决于<4的部分,即mod 4后的异或和

那么我们有:
如果n为奇数
\(n \equiv 1 \pmod{4}\)\(f(0,n) = 1\)
\(n \equiv 3 \pmod{4}\)\(f(0,n) = 0\)

2、若n为偶数,那么最高位出现了\(n + 1\)次为奇数,一定可以保留
同样的,\(f(2^k,n) = f(0,n - 2^k)\),可以发现\(n - 2^k\)与n具有相同的奇偶性,可以利用同样的推导去掉
最后\(f(0,n)\)的后两位就取决于<4的部分

那么我们有:
如果n为偶数
\(n \equiv 0 \pmod{4}\)\(f(0,n) = n\)
\(n \equiv 2 \pmod{4}\)\(f(0,n) = n + 1\)

这样,我们就get了一个\(O(1)\)求连续数字异或和的方法

\(n \equiv 0 \pmod{4}\)\(f(0,n) = n\)
\(n \equiv 1 \pmod{4}\)\(f(0,n) = 1\)
\(n \equiv 2 \pmod{4}\)\(f(0,n) = n + 1\)
\(n \equiv 3 \pmod{4}\)\(f(0,n) = 0\)

posted @ 2018-03-23 19:33 Mychael 阅读(...) 评论(...) 编辑 收藏