NC275631 嚶嚶不想求異或

363045841發表於2024-07-08

講真牛客這次的直播錄屏講得挺爛的(暴論),板書爛,表達爛...

\(1\sim x\) 的異或和

當然,求異或和本質上是求每一位的二進位制值。
前置知識:

  1. 和十進位制一樣,二進位制下最左邊是高位,最右邊是低位;
  2. 異或和計算中,偶數個 \(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. 顯然結果為 1
  2. \(x+1\),第一位結果為 1,等價於當前數再加 1
  3. \(0\),此時各位 \(1\) 都是偶數個
  4. 在 (3) 的情況下多寫了一位,最終異或和就是當前數本身。

\(l\sim r\) 的異或和

已經知道異或和的值反映的是當前位上 \(1\) 的奇偶個數,又知道以下規律:

  1. 奇+奇=偶
  2. 奇+偶=奇
  3. 偶+偶=偶

也就是 \([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\)

相關文章