1. 程式人生 > >連續數字異或和

連續數字異或和

打表 lin log inline 相同 出現的次數 line body 連續

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

連續數字異或和