【學習筆記】Nim積


定義

定義作用在兩個非負整數 \(a, b\) 上的運算 \(\otimes\)\(a\otimes b=\operatorname{mex}_{0\leq i< a, 0\leq j<b}\{(a\otimes j)\oplus (i\otimes b)\oplus (i\otimes j) \}\),其中 \(\oplus\) 為按位異或操作,也稱為 Nim和,\(\otimes\) 即為 Nim積。

基本性質

與整數的乘法和加法類似,Nim積 和 Nim和 滿足交換律,結合律和分配律,即:

  • \(a\otimes b=b\otimes a\)
  • \((a\otimes b)\otimes c=a\otimes (b\otimes c)\)
  • \((a\oplus b)\otimes c=a\otimes c\oplus b\otimes c\)

同時,\(0\)\(1\) 分別是 Nim積 的零元和單位元,即:

  • \(0\otimes a=a\otimes 0=0\)
  • \(1\otimes a=a\otimes 1=a\)

由於 Nim積 與整數乘法如此高的相似性,許多由整數乘法和加法實現的算法,均可以用 Nim積 和 Nim和 來代替整數乘法和加法,如高斯消元等。

計算方式

經過數學家們的努力,人們得到了 Nim積 的兩條重要規律:

  • \(k\) 為滿足 \(2^{2^k}> a\) 的非負整數,則 \(a\otimes 2^{2^{k}}=a\cdot 2^{2^{k}}\)
  • \(2^{2^{k}}\otimes 2^{2^{k}}=\frac{3}{2}\cdot 2^{2^{k}}\)

其中形如 \(2^{2^k}\) 的數被稱為費馬數。

有了這兩條規律,結合上述的基本性質,我們可以得到一個單次 \(O(\log^2 n)\) 復雜度的分治算法:

  • \(\min(a, b)\leq 1\),返回 \(a\cdot b\)
  • \(\max(a, b)< 2^8\),且曾經計算過 \(a\otimes b\),則返回記憶的值。(很強的常數優化)
  • 否則設 \(k\) 為滿足 \(2^{2^k}>\max(a, b)\) 的最小非負整數,\(a_0, b_0\)\(a, b\) 較低的 \(2^{2^{k-1}}\) 位,\(a_{1}, b_{1}\)\(a, b\) 較高的 \(2^{2^{k-1}}\) 位(即 \(2^{2^{k-1}}>a_0, b_0, a_1, b_1\)),則:

\[\begin{aligned}a\otimes b&= a_0\otimes b_0\oplus 2^{2^{k-1}}\otimes (a_{1}\otimes b_{0}\oplus a_0\otimes b_1)\oplus (2^{2^{k-1}}\oplus2^{2^{k-1}-1})\otimes a_1\otimes b_1\\&=a_0\otimes b_0\oplus 2^{2^{k-1}}\cdot ((a_0\oplus a_1)\otimes (b_0\oplus b_1)\oplus a_0\otimes b_0)\oplus 2^{2^{k-1}-1}\otimes a_1\otimes b_1\end{aligned} \]

實現代碼如下:

ull nimProd(ull x, ull y, int p = 32) {
    if (x <= 1 || y <= 1) return x * y;
    if (p < 8 && rem[x][y]) return rem[x][y];
    ull a = x >> p, b = ((1ull << p) - 1) & x, c = y >> p, d = ((1ull << p) - 1) & y;
    ull bd = nimProd(b, d, p >> 1), ac = nimProd(nimProd(a, c, p >> 1), 1ull << p >> 1, p >> 1), ans;
    ans = ((nimProd(a ^ b, c ^ d, p >> 1) ^ bd) << p) ^ ac ^ bd;
    if (p < 8) rem[x][y] = rem[y][x] = ans;
    return ans;
}

Nim積 的另一個重要性質為:\(a^{2^{2^k}-1}\equiv 1 \bmod 2^{2^k}\)

具體證明較為繁瑣,珂以類比整數乘法運算中的費馬小定理理解。

例題:[SOJ]【WC 聯訓 Round #6】憤划


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM