講真牛客這次的直播錄屏講得挺爛的(暴論),板書爛,表達爛...
求 \(1\sim x\) 的異或和
當然,求異或和本質上是求每一位的二進位制值。
前置知識:
- 和十進位制一樣,二進位制下最左邊是高位,最右邊是低位;
- 異或和計算中,偶數個 \(1\) 結果為,反之為 1。
迴圈週期推導
接下來推導為什麼異或和的迴圈週期為 \(4\):
先從最基本的 \(1\;xor\;2\;xor\;3\;xor\;4 = 0\) 開始,
001 (1)
010 (2)
011 (3)
100 (4)
注意到前兩位的 \(1\) 都是偶數,在排列組合中,兩位的全排列需要 \(A_2^2=4\) 次完成,在這個週期內後面兩位的異或結果為 \(0\),對後續週期沒有影響。
再往下一個週期:
0100
0101 (1)
0110 (2)
0111 (3)
1000 (4)
將上個週期附加在下個週期的開頭,由於前兩位都是 \(0\),所以對異或結果沒有影響。
也就是說,在 \(T=4\) 的情況下,每 4 次前 \(n-1\) 位的 1 的個數為偶數,則此時異或和等於該週期的最後一個數,即:
\[(x-3)\;xor\;(x-2)\;xor\;(x-1)\;xor\;x= x
\]
由右端點推出異或和
根據上面的規律,可以繼續推導最後一個週期中的四個數與最終異或和的關係:
- 顯然結果為 1
- \(x+1\),第一位結果為 1,等價於當前數再加 1
- \(0\),此時各位 \(1\) 都是偶數個
- 在 (3) 的情況下多寫了一位,最終異或和就是當前數本身。
求 \(l\sim r\) 的異或和
已經知道異或和的值反映的是當前位上 \(1\) 的奇偶個數,又知道以下規律:
- 奇+奇=偶
- 奇+偶=奇
- 偶+偶=偶
也就是 \([1,l-1]_1+[l,r]_1=[1,r]_1\),根據已知規律可求的 \([1,l-1],[1,r]\) 即可唯一對應到 \([l,r]\) 的奇偶數,進而求出該位的異或和值。
不難發現,令奇數為 \(1\),偶數為 \(0\),\([l,r]_1=[1,l-1]_1\;xor\;[1,r]_1\)。