连续数字异或和

求[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)

原文地址:https://www.cnblogs.com/Mychael/p/8633365.html