1. 游戏规则回顾
* 两堆石子,数量分别为 (a) 和 (b),满足 (a ≤\leq≤ b)。
* 两位玩家轮流操作,每次操作可以从一堆中取任意颗石子,或者从两堆中取同样多的石子。
* 无法操作的玩家输掉游戏。
2. 必败状态的定义
* 必败状态:当前玩家无论怎么操作,最终都会输掉游戏的状态。
* 必胜状态:当前玩家可以通过某种操作,将游戏状态转化为对方的必败状态,从而获胜。
3. 必败状态的性质
通过观察和归纳,我们发现一些必败状态:
* ((0, 0))
* ((1, 2))
* ((3, 5))
* ((4, 7))
* ((6, 10))
这些必败状态满足以下规律:
* 设第 (k) 个必败状态为 ((aka_kak , bkb_kbk )),则 (bkb_kbk = ak+ka_k + kak +k)。
* (aka_kak ) 是集合 ({a0a_0a0 ,a1a_1a1 , a2a_2a2 , …\ldots…}) 中最小未出现的整数。
4. 必败状态的证明
4.1 必败状态的后继状态不是必败状态
证明:
* 假设 ((aka_kak , bkb_kbk )) 是一个必败状态,其中 (bkb_kbk = ak+ka_k + kak +k)。
* 从一堆中取石子:
* 如果从 (aka_kak ) 堆中取 (x) 个石子,变为 ((ak−xa_k - xak −x, bkb_kbk ))。
* 如果从 (bkb_kbk ) 堆中取 (x) 个石子,变为 ((aka_kak , bk−xb_k - xbk −x))。
* 这些状态的差值 (bkb_kbk - aka_kak ) 不再等于 (k),因此不可能是必败状态。
* 从两堆中取同样多的石子:
* 如果从两堆中各取 (x) 个石子,变为 ((ak−xa_k - xak −x, bk−xb_k - xbk −x))。
* 由于 (bk−ak=kb_k - a_k = kbk −ak =k),新的差值 (bk−x−(ak−xb_k - x - (a_k - xbk −x−(ak −x) = k),但 (ak−xa_k - xak −x) 和 (bk−xb_k - xbk −x) 不满足 (aka_kak ) 是最小未出现整数的性质,因此不可能是必败状态。
因此,必败状态的后继状态不可能是另一个必败状态。
4.2 必胜状态必有一个后继状态是必败状态
证明:
* 假设 ((a, b)) 是一个必胜状态,其中 (a ≤\leq≤ b)。
* 如果 (a = 0),则从 (b) 堆中取 (b) 个石子,变为 ((0, 0)),这是一个必败状态。
* 如果 (a > 0):
* 如果 (b = a + k),其中 (k) 是某个整数:
* 如果 (a) 是集合 ({a0a_0a0 , a1a_1a1 , a2a_2a2 , …\ldots…}) 中的某个 (aia_iai ),则 ((a, b)) 本身是必败状态,矛盾。
* 如果 (a) 不是集合中的某个 (aia_iai ),则存在某个 (aia_iai ) 使得 (ai<aa_i < aai <a) 且 (aia_iai ) 是最小未出现整数。从 (a) 堆中取 (a−aia - a_ia−ai ) 个石子,变为 ((ai,b−(a−ai)a_i, b - (a - a_i)ai ,b−(a−ai ))),这是一个必败状态。
* 如果 (b ≠\neq= a + k),则可以通过从 (b) 堆中取 (b - (a + k)) 个石子,变为 ((a, a + k)),这是一个必败状态。
因此,必胜状态必有一个后继状态是必败状态。
5. 必败状态的通项公式
根据上述规律,我们可以得出必败状态的通项公式:
* 设当前状态为 ((a, b)),其中 (a≤\leq≤ b)。
* 当 (a=⌊(b−a)×ϕ⌋a=\left\lfloor (b - a)\times\phi \right\rfloora=⌊(b−a)×ϕ⌋) 时,该状态为必败状态,其中 (ϕ=1+52\phi = \frac{1 + \sqrt{5}}{2}ϕ=21+5 ) 是黄金分割比。
代码去看看别的题解里的吧,都看到这了要是就为了份代码就没意思了。