問題
在一個有n堆石子的取石子游戲中,雙方玩家根據既定規則,依次輪流從n堆石子中取走石子,且每人每次只能從單一的堆中取出石子.當某個玩家無法按照既定規則取出石子時,該玩家落敗,同時另一名玩家獲勝.
現在,給定n堆石子,問先手玩家是否可以獲勝.
定義
將第i堆石子記爲hi,用元組(h1,h2,…,hn)表示由這n堆石子組成的局面S,記爲:
S=(h1,h2,…,hn)
特別地,當n=1時,記爲S=(h1)或S=h1.這樣,hi除了可以表示一堆石子外,還可以表示一個只有一堆石子的局面.
局面的後繼:若局面S經歷一次取出後變爲局面T,則稱T是S的後繼.
結束局面:若玩家無法按照既定規則從S中取出石子,則稱S爲”結束局面”,結束局面沒有後繼.
mex函數
定義非負整數冪集上的函數mex:
mex(A)=min({x|x∈N-A})
直觀上,可將mex理解爲”集外最小序數”.
f函數
定義堆集合上的函數f:
f(h)= mex({f(i)|i是h的後繼})
特別地,若h是一個結束局面,則f(h)=0.
現在,將f的定義域擴展到n維:
f(h1,h2,…,hn) = f(h1)⊕f(h2)⊕…⊕f(hn)
再次擴展f,使其可以作用於局面.即對於任意局面:
S=(h1,h2,…,hn)
T=(i1,i2,…,im)
定義:
f(S)=f(h1,h2,…,hn)
f(S,T)=f(h1,…,hn,i1,i2,…,im)
結論
f具有下列性質:
- 若S是結束局面,則f(S)=0
- 若f(S)=0,則f(T)!=0
- 若f(S)!=0,則存在T,f(T)=0
進一步:
- 若f(S)=0,則先手玩家必敗
- 若f(S)!=0,則先手玩家必勝
證明
不加證明地給出關於異或(⊕)運算的下列性質:
- 性質1: a⊕b=0當且僅當a=b
- 性質2: 若a⊕b=c,則a⊕c=b
- 性質3: 若a=a1⊕a2⊕…⊕an,則存在ai(1≤i≤n)滿足:ai⊕a<ai
同時給出關於f的下列性質:
- f(h1,h2,…,hn)=f(h1,…,hi)⊕f(hi+1,…,hn), 1<i<n
證明:若S是結束局面,則f(S)=0
若S只包含一個堆,f(S)=mex(∅)=0.
若S=(h1, h2, …, hn),
顯然對於∀i(1≤i≤n),hi是結束局面.
所以 f(S)=f(h1)⊕f(h2)⊕…⊕f(hn)=0
證明:若f(S)=0,則∀T,若T是S的後繼則f(T)≠0
設 S=(h1, h2, …, hn),
因爲 f(S)=0
所以 f(h1)⊕f(h2)⊕…⊕f(hn)=0
所以 f(h1)=f(h2)⊕…⊕f(hn)(⊕的性質1)
不妨設T是玩家從h1中取走石子後生成的局面.
即 T=(h1*, h2, …, hn)
所以 f(T)= f(h1)⊕f(h2)⊕…⊕f(hn)=f(h1)⊕f(h1*)
注意到h1*是h1的後繼,由f的定義易知:
f(h1*)≠f(h1)
所以 f(h1*)⊕f(h1)≠0(⊕的性質1)
所以 f(T)≠0
證明:若f(S)≠0,則∃T,T是S的後繼且f(T)=0
設 S=(h1, h2, …, hn),f(S)=a>0,
不妨設h1⊕a=b<h1
又設T=(h1*, h2, …, hn),
易知:f(T)=a⊕f(h1)⊕f(h1*),
即:f(T)=b*f(h1*),
另一方面,由mex的定義可知,對∀0≤x<a, ∃i st. f(i)=x 且i是h1的後繼,
所以必存在: h1*=b
即必有T st. f(T) = 0