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