定義
- 必勝或必勝狀態:僅僅考慮當前的狀態,不考慮的操作人時,一定必勝或必輸
- \(a\oplus b\) :\(a,b\) 在二進位制下,對位取反。
Nim 遊戲
考慮有 \(n\) 堆石子,兩個人輪流來拿走棋子(至少拿一個),拿到最後剩下的一顆棋子的人獲勝。
結論:
定義 Nim 和 \(= a_1\oplus a_2\oplus a_3\oplus\dots\oplus a_n\)。
當 Nim 和 為 \(0\) 時,該狀態為必敗狀態;反之,則為必勝狀態。
證明:
我們需要三個引理:
-
無後繼狀態為必敗狀態
這個情況只有全 \(0\),同時滿足 \(a_1\oplus a_2\oplus\dots\oplus a_n=0\) 。
-
對於當前狀態 \(a_1\oplus a_2\oplus\dots\oplus a_n\ne0\),一定存在某種移動使得其異或和為 \(0\)
考慮來構造一下:
設 \(a_1\oplus a_2\oplus\dots\oplus a_n=s\),同時設 \(s\) 的在二進位制下,最高位為 \(k\) 。
如果我們想使 \(s\) 變為 \(0\),就非常想兩邊同時乘 \(s\) 。
但是每次進行一次拿石子必須需要時某個 \(a_i\) 減少,
所以可以考慮在 \(a_i\) 處拿,則需要證明 \(a_i\oplus s<a_i\) 的。
現在來想一想異或的定義,發現 \(s\) 最高位為 \(1\) ,則在 \(a_1,a_2\dots,a_n\) 肯定有一個 \(t\) ,使得 \(a_t\) 這一位也是 \(1\)
那就拿 \(a_t\oplus s\) ,我們又發現最高位變成了 \(0\) 。
由於這是最高位,則 \(a_t\) 比 \(k\) 還高的位就不會改變,所以 \(a_t\oplus s\) 一定 \(<a_t\) 。
於是就構造出來一組解了。
-
對於當前狀態 \(a_1\oplus a_2\oplus\dots\oplus a_n=0\),一定不存在某種移動使得其異或和為 \(0\)
也就是說,只要有一個 \(a\) 陣列中數的位發生改變,那麼其異或和就不為零了。