Bash Game

显然,对于问题有必败态 n=m+1n = m + 1

n=r(m+1)+sn = r \cdot (m + 1) + s,其中 rr 为任意自然数,sms \leq m

  1. 考虑 s0s \neq 0 的情况:
  • r=0r = 0,先手可以直接取完,先手必胜。
  • r0r \neq 0,对于先手总能构造局势 n=r(m+1)n = r \cdot (m + 1) 的局势给后手,直至 r=0r = 0,先手必胜。
  1. s=0s = 0,两者角色互换,后手总能构造必败局面给先手,先手必败。

结论:如果 (m+1)  n(m + 1) \ |\ n,则先手必败,否则先手必胜。

Nim Game

小红与小明在玩游戏,一共有 nn 堆物品,每堆中有 aia_i 数量的物品。

每次从某一堆中取物品,至多将这全部拿走,不能不拿,拿到最后一个物品的玩家获胜。

  1. 定义一个 nn 元组 (a1,a2,,ana_1, a_2, \dots, a_n), 来描述游戏的一个局势。
  • 任意改变 nn 元组中元素的顺序,仍然代表同一个局势。
  • 如果初始局面只有一堆,则先手必胜。
  • 如果初始局势有两堆,且两堆数量相同,后手必胜。(对称性)
  1. 定义局势加法:(a1,a2,,ana_1, a_2, \cdots, a_n) + (b1,b2,,bmb_1, b_2, \cdots, b_m) = (a1,,an,b1,,bna_1, \cdots, a_n, b_1, \cdots, b_n)。

​ eg. (3) + (3) + (1) = (3, 3) + (1) = (3, 3, 1)

  1. 对于局势A,B,SA, B, S, 若 S=A+BS = A + B, 称 SS 可以分解为“子局势” AABB(对称性)
  2. 对于局势A,如果先手有必胜策略,称“S胜”;如果后手有必胜策略,称“S负”。
  • 如果局面为 SS 胜,那么存在一种策略 S>TS -> TTT 负。
  • 如果局面为 SS 负,那么对于任意一种策略 S>TS -> TTT 胜。
  1. 给定一个局势 SS,可以分解成两个子局势 AABB
  • AABB 为一胜一负,则 SS 胜。
  • AABB 负,则 SS 负。
  • AABB 胜,则有时 SS 胜,有时 SS 负。
  1. 二进制不进位加法(异或\oplus)与局势加法对比

​ 令 A,BA, B 代表局势,小写字母 a,ba, b 表示二进制数,那么:

  • AABB 相同,则 A+BA + B 负;若 a0a \neq 0b=0b = 0,则 ab0a \oplus b \neq 0
  • AABB 负,则 A+BA + B 胜;若 a0a \neq 0b=0b = 0,则 ab0a \oplus b \neq 0
  • BBAA 负,则 A+BA + B 胜;若 a0a \neq 0a=0a = 0,则 ab0a \oplus b \neq 0
  • AABB 负,则 A+BA + B 负;若 a=0a = 0b=0b = 0,则 ab=0a \oplus b = 0

猜想:令 f(S)f(S) 表示 SS 局势的异或和,即 a1a2ana_1 \oplus a_2 \cdots \oplus a_n。

  • f(S)0f(S) \neq 0,先手必胜。
  • f(S)=0f(S) = 0,后手必胜。

推导过程:

结论1. a1a2an=p0a_1 \oplus a_2 \cdots \oplus a_n = p \neq 0,那么 k[1,n],akp<pk\exist k \in [1, n], a_k \oplus p < p_k。

证明:

  • p0p\because p \neq 0 \therefore p 二进制最高位为1;
  • 设其最高位为第 qq 位;
  • 那么至少存在一个 kk,使得 aka_k 的第 qq 位也是1;
  • akpa_k \oplus p 的第 qq 位为0,所以 akp<aka_k \oplus p < a_k .

结论2. 若 f(S)=0f(S) = 0,无论先手如果操作,都有 STS \to T 满足 f(T)0f(T) \neq 0。

证明:

  • 不妨设先手在第一堆取了 xx 个,那么对于局势 T=(a1x,a2,,an)T = (a_1 - x, a_2, \cdots, a_n)
  • 由于 f(S)=a1a2an=0f(S) = a_1 \oplus a_2 \cdots \oplus a_n = 0, 所以 a1=(a2a3an)a_1 = (a_2 \oplus a_3 \cdots \oplus a_n) 。
  • f(T)=(a1x)(a1)f(T) = (a_1 - x) \oplus (a_1),而 a1xa1a_1 - x \neq a_1,所以 f(T)0f(T) \neq 0

结论3. 若f(S)0f(S) \neq 0,必然存在一种操作方式 STS \to T满足 f(T)=0f(T) = 0

证明:

  • p=f(S)=a1a2an0p = f(S) = a_1 \oplus a_2 \cdots \oplus a_n \neq 0
  • p0p \neq 0,那么存在 kk,使得 akp<aka_k \oplus p < a_k,不放设 k=1k = 1,即 a1p=x<a1a_1 \oplus p = x < a_1。
  • 如果先行者将第一堆数量变为 xx,那么局势 T=(x,a2,an)T = (x, a_2, \cdots a_n)
  • 由于 p=a1(a2an)p = a_1 \oplus (a_2 \cdots a_n),所以 a2a3an=pa1a_2 \oplus a_3 \cdots \oplus a_n = p \oplus a_1
  • 所以 f(T)=x(pa1)=0f(T) = x \oplus (p \oplus a_1) = 0