Bash Game
显然,对于问题有必败态 n=m+1。
设 n=r⋅(m+1)+s,其中 r 为任意自然数,s≤m。
- 考虑 s=0 的情况:
- r=0,先手可以直接取完,先手必胜。
- r=0,对于先手总能构造局势 n=r⋅(m+1) 的局势给后手,直至 r=0,先手必胜。
- 当 s=0,两者角色互换,后手总能构造必败局面给先手,先手必败。
结论:如果 (m+1) ∣ n,则先手必败,否则先手必胜。
Nim Game
小红与小明在玩游戏,一共有 n 堆物品,每堆中有 ai 数量的物品。
每次从某一堆中取物品,至多将这全部拿走,不能不拿,拿到最后一个物品的玩家获胜。
- 定义一个 n 元组 (a1,a2,…,an), 来描述游戏的一个局势。
- 任意改变 n 元组中元素的顺序,仍然代表同一个局势。
- 如果初始局面只有一堆,则先手必胜。
- 如果初始局势有两堆,且两堆数量相同,后手必胜。(对称性)
- 定义局势加法:(a1,a2,⋯,an) + (b1,b2,⋯,bm) = (a1,⋯,an,b1,⋯,bn)。
eg. (3) + (3) + (1) = (3, 3) + (1) = (3, 3, 1)
- 对于局势A,B,S, 若 S=A+B, 称 S 可以分解为“子局势” A 和 B。(对称性)
- 对于局势A,如果先手有必胜策略,称“S胜”;如果后手有必胜策略,称“S负”。
- 如果局面为 S 胜,那么存在一种策略 S−>T,T 负。
- 如果局面为 S 负,那么对于任意一种策略 S−>T,T 胜。
- 给定一个局势 S,可以分解成两个子局势 A 和 B。
- 若 A 和 B 为一胜一负,则 S 胜。
- 若 A 负 B 负,则 S 负。
- 若 A 胜 B 胜,则有时 S 胜,有时 S 负。
- 二进制不进位加法(异或⊕)与局势加法对比
令 A,B 代表局势,小写字母 a,b 表示二进制数,那么:
- 若 A 和 B 相同,则 A+B 负;若 a=0 且 b=0,则 a⊕b=0。
- 若 A 胜 B 负,则 A+B 胜;若 a=0 且 b=0,则 a⊕b=0。
- 若 B 胜 A 负,则 A+B 胜;若 a=0 且 a=0,则 a⊕b=0。
- 若 A 负 B 负,则 A+B 负;若 a=0 且 b=0,则 a⊕b=0。
猜想:令 f(S) 表示 S 局势的异或和,即 a1⊕a2⋯⊕an。
- 若 f(S)=0,先手必胜。
- 若 f(S)=0,后手必胜。
推导过程:
结论1. a1⊕a2⋯⊕an=p=0,那么 ∃k∈[1,n],ak⊕p<pk。
证明:
- ∵p=0∴p 二进制最高位为1;
- 设其最高位为第 q 位;
- 那么至少存在一个 k,使得 ak 的第 q 位也是1;
- ak⊕p 的第 q 位为0,所以 ak⊕p<ak .
结论2. 若 f(S)=0,无论先手如果操作,都有 S→T 满足 f(T)=0。
证明:
- 不妨设先手在第一堆取了 x 个,那么对于局势 T=(a1−x,a2,⋯,an)。
- 由于 f(S)=a1⊕a2⋯⊕an=0, 所以 a1=(a2⊕a3⋯⊕an)。
- 故 f(T)=(a1−x)⊕(a1),而 a1−x=a1,所以 f(T)=0 。
结论3. 若f(S)=0,必然存在一种操作方式 S→T满足 f(T)=0。
证明:
- 设 p=f(S)=a1⊕a2⋯⊕an=0。
- 由 p=0,那么存在 k,使得 ak⊕p<ak,不放设 k=1,即 a1⊕p=x<a1。
- 如果先行者将第一堆数量变为 x,那么局势 T=(x,a2,⋯an)。
- 由于 p=a1⊕(a2⋯an),所以 a2⊕a3⋯⊕an=p⊕a1。
- 所以 f(T)=x⊕(p⊕a1)=0。