六年后回看 CSP-S 2020 T4 贪吃蛇
题目引入
六年前考 CSP-S 2020 时,由于我当时的代码能力并不娴熟,写完前两题后,留给我的时间已经不多。然后 T4 看了一眼题面,就写了 20 分特殊情况赶紧走人。六年后,我从蒋炎岩的视频得知 OI 圈又发生了诸多变化,这让我再次回到了我曾经刷题的洛谷,发现 LLM 经过一定的尝试甚至可以 AC 一道新鲜出炉,并且只有出题人一人通过的黑题。
——当然我今天要说的重点不是这个,而是我回到了当时苟且偷生 20 分的 T4 贪吃蛇,简化题面是:
有
条蛇,编号为 ,初始体力为正整数 ,满足 任意时刻,用
比较蛇的强弱:体力大者更强;体力相同时,编号大者更强。因此最强蛇和最弱蛇唯一确定。 当前最强蛇可以选择是否吃掉当前最弱蛇。若最强蛇为
,最弱蛇为 ,吃后最弱蛇死亡,最强蛇变为 每条蛇都是理性的:当它成为当前最强蛇时,当且仅当它吃掉当前最弱蛇后,在后续同样规则下自己最终不会死亡,它才会吃;否则它不吃,游戏立即结束。只剩一条蛇时游戏结束。
问题是求最终会剩下几条蛇?
。
当然这个题已经有很多题解了,然而我在尝试上手这套题时,意外提出了另一个猜想:
当初态蛇的体力单调递增(而不是单调不降),也就是满足:
时,那么最后剩余蛇的数量一定是奇数吗?
当然,答案是 yes,只不过证明的过程比我想象的要繁琐得多,甚至比原题本身的思维+代码过程还要繁琐。更重要的是,完整的证明过程全部由 LLM 生成,这似乎与前文的 LLM AC 黑题交相呼应。
简要思路
这里我尽量先从人类的思维方式拆解这道题,然后在下一节给出 AI 自底向上的 Lemma-Theorem 风格的证明过程。
从原题题解出发
首先根据原题的题解,我们知道在一般的单调不降版本,一共有两个阶段:
- 阶段一(安全步):所有最强蛇进食后都不是最弱蛇,放心大胆吃!
- 阶段二(危险步):所有最强蛇进食后都是最弱蛇,直到有条蛇可以放心吃为止(吃了后不是最弱或者只剩两条)
- 阶段一结束时,游戏就基本结束了(根据阶段二的奇偶性看能不能再吃一次)
我们着重理解一下“根据阶段二的奇偶性看能不能再吃一次”这句话。首先考虑危险步的场景:
- 如果只有两条蛇,那么最强蛇的选择是毫无疑问的“肯定吃”;
- 如果有三条蛇,那么最强蛇吃完变成最弱,那么在下一轮一定被吃。所以最强蛇肯定选择不吃;
- 如果有四条蛇,那么最强蛇肯定会选择吃,因为它变成最弱后,根据上一行的结论,当前最强蛇肯定不会吃它;
- ......
所以根据以上推理,当
所以我们有一个很美好的设想——如果危险步一旦进入,不会切换成安全步,那么这道题其实就做完了。我经过了大量随机单调递增序列的验证,并没有找到反例,甚至即使只是把“单调递增”改为“单调不减”都能很快找到反例(比如说 1 1 1 1,第一步吃完后马上变成阶段一)。说明最后剩下奇数这个条件其实很苛刻,这进一步增强了“单调递增序列”真的满足“阶段二不会切换成阶段一”的可能性。
核心不等式
我们的思路是使用归纳法。首先我们来模拟一次最强蛇吃最弱蛇的过程,我们记当前剩下的蛇
我们假设当前位于危险步(如果这个起始条件一直不成立,这意味着整个过程一直都是安全步,最后一定得到结果
然后根据归纳法,需要证明下一步是危险步也仍然成立。具体而言,目前的最强蛇
因为
主要 invariant 以及简要直觉说明
为了证明这个不等式,有以下五个不变量(性质)被用到:
: 不会有三条蛇体力相同。 : 如果出现一对体力相同的蛇,那么这个体力一定比当前“最强体力 − 最弱体力”(记为 )还大。 : 对于某低体力区(位置 ,并且体力不超过 )的蛇 ,若 排在 右边,则 。 : 非最底部(位置 )的相等对,左边那条的编号小于它右侧所有蛇的编号。 : 不同体力的两组相等对必须编号交错。例如 但 ,则 。(欲证的 是其直接推论)
注意我们欲证的这五个性质无论是在安全步还是在危险步都满足,而严格递增的初始态显然满足。因此这里还是类似于联合归纳的思路,假设
| 要证明下一状态的性质 | 主要用到当前状态的性质 |
|---|---|
| A' | B |
| B' | A、B |
| C' | A、C |
| D' | C、D |
| E' | A、B、D、E |
然后接下来说一下每一个性质的直觉步骤(为了书写方便,记
A'
如果出现三条体力相同的蛇,那么新增的蛇体力值
B'
这应该是最难证的一个性质。分为两种情况:这一个相等对是这一轮新出现的,还是先前就存在的:
对于这一对是新出现的情况,当蛇
对于先前就存在这一对的情况,先前的情况
C'
D'
这里考虑两种情况:旧相等对不变和插入新相等对。对于前者,根据先前的情况
对于出现了新相等对的情况,设新相等对
E'
这里考虑四种情况(从低到高):旧-旧、旧-新、新-旧、新-新。第一种情况可以直接
最后只剩下情况 新-旧。仍然设新相等对
完整证明
注意接下来的内容由 GPT 5.5-Pro 生成,我本人一共使用了三次 prompt:
第一次是给题意;
第二次追问 GPT 写出证明
的具体过程; 第三次是“请你把之前的输出合起来,写成一个完整的证明”。
这里只给出第三次 prompt 的完整输出。
下面把前面的结论合成一篇完整证明。记一条蛇为
其中
当且仅当
或
所以
定理
从初态
出发,按照题目中的理性规则进行游戏,最终存活蛇的数量一定为奇数。
一、强制过程与记号
先定义一个辅助过程,称为强制过程:无论蛇是否理性,每一步都强制令当前最强蛇吃掉当前最弱蛇。
若某个强制可达状态中还有
记
其中
于是
若
当前最强蛇
记当前状态的宽度为
二、强制过程中的核心不变量
我们先证明一个较强的不变量族。之后要用到的关键结论是:
若某个强制可达状态中,前两条蛇体力相同,后两条蛇体力也相同,即
则
为了严格证明它,我们同时证明以下五个性质在所有强制可达状态中成立。
不变量 A:不存在三条蛇体力相同
即任意强制可达状态中,不可能有三条蛇具有同一体力。
不变量 B:相等相邻对的体力大于当前宽度
若
则
不变量 C:低体力区编号单调
若
则对所有
不变量 D:非底部相等对的左端编号小于右侧所有蛇编号
若
则对所有
不变量 E:两个相等相邻对之间满足交叉编号关系
若
则
我们将证明 A–E 对所有强制可达状态成立。
初态成立
初态中
因此没有任何相等体力对,所以 A、B、D、E 都是空命题。
而初态排序就是
所以若
因此 C 也成立。
归纳步
假设某个强制可达状态
满足 A–E。
记
强制下一步中,新蛇为
下一状态由
重新排序得到,记为
设其体力为
下一状态宽度为
下一状态的体力集合是
所以
下面分别证明 A–E 在下一状态中仍成立。
1. 证明 B 在下一状态中成立
取下一状态中的一个相等相邻对,设其体力为
分两类。
情形 1:这是旧相等对
也就是说,这个相等对不含新蛇
由于归纳假设 A 成立,原状态中不存在三条同体力蛇,所以这个旧相等对在原状态中也是相等相邻对。由归纳假设 B,
我们要证明
因为
若
则
于是
若
则
这个旧相等对不含
于是
所以旧相等对满足 B。
情形 2:这是新产生的相等对
这说明新蛇
恰好等于某条旧蛇
于是新相等对的体力为
因为
我们要证明
若
则原状态底部有相等对
但另一方面
矛盾。
所以
又因为
故
于是
所以新相等对也满足 B。
因此 B 在下一状态中成立。
2. 证明 A 在下一状态中成立
原状态中没有三条蛇体力相同。
下一状态中唯一可能产生新的体力重合的是新蛇
如果
但若原状态中已经有两条旧蛇体力为
因此新蛇最多只能与一条旧蛇同体力,不可能制造三条同体力蛇。
所以 A 在下一状态中成立。
3. 证明 C 在下一状态中成立
我们要证明:若
则对所有
先说明
若
又因为
于是
若
与
故
于是
所以
但
因此
因为删去
下面证明
反设
若
则
于是
与
矛盾。
若
则
从而
由
所以
但
于是
出现三条同体力蛇,违反 A。
故必有
由原状态的 C,因
可知对所有
下一状态中排在
所以 C 在下一状态中成立。
4. 证明 D 在下一状态中成立
取下一状态中的一个非底部相等相邻对
且
我们要证明:对所有
情形 1:这是旧相等对
设它在原状态中为
因为它不含被删去的
由原状态的 D,
对所有
成立。
下一状态中排在这个旧相等对右侧的蛇,要么是旧蛇
情形 2:这是新产生的相等对
这说明
对某个
由于这个相等对在下一状态中不是底部相等对,即
由原状态的 C,因
可知对所有
特别地,
所以在这个新相等对中,左端是旧蛇
下一状态中排在这个新相等对右侧的蛇都是旧蛇
所以 D 在下一状态中成立。
5. 证明 E 在下一状态中成立
取下一状态中的两个相等相邻对:
和
其中
我们要证明
情形 1:两个相等对都是旧相等对
它们在原状态中也是两个相等相邻对,并且相对顺序不变。
由原状态的 E,直接得到
情形 2:低的相等对是新的,高的相等对是旧的
新的相等对由
和某条旧蛇
因此这个新相等对的右端编号为
设高的旧相等对在原状态中为
这个旧相等对不含
由原状态的 D,
下一状态中,这个旧高相等对的左端编号仍为
所以 E 成立。
情形 3:低的相等对是旧的,高的相等对是新的
这种情况不可能。
因为新相等对的体力必为
而由原状态的 B,任意旧相等对的体力都严格大于
情形 4:两个相等对都是新的
这种情况也不可能,因为一步只插入一条新蛇
因此 E 在下一状态中成立。
综上,A–E 对所有强制可达状态成立。
特别地,由 E 得到我们后面需要的核心结论:
若某个强制可达状态中
则取 E 中
得到
也就是说:
三、安全步与危险步
现在回到强制过程。
在状态
中,强制令最强蛇
如果
如果
当
四、安全步中的蛇一定会吃
我们证明:
若某一步是安全步,则当前最强蛇在理性游戏中一定会吃。
设当前状态为
当前最强蛇为
因为这一步是安全步,所以
我们先证明一个保护性质:
在强制过程之后的演化中,在
下一次成为最强蛇之前, 不会成为最弱蛇。
证明如下。
首先,安全步推出
否则若
则底部有相等对。由不变量 B,
于是
这说明新蛇
所以
现在看吃后状态。把除
即比
即比
因为这是安全步,所以
若
则
下面假设
我们证明如下性质会一直保持:
对任意
都有
初始时,
因此
所以
现在假设这个性质在某个时刻成立,且
因为
设当前最强蛇为
当前最弱蛇为
强制过程下一步会产生
由保持性质,
所以
接下来只需检查保持性质仍然成立。
对旧的
只需检查新的弱蛇
因为
从而
于是
若
则
所以
若
则
此时
则必须有
于是
由核心不变量,
所以即使体力相同,也有
因此保持性质成立。
于是,只要
所以
现在回到理性游戏。
如果从吃后的状态开始,游戏在
如果游戏进行到
所以,在安全步中,当前最强蛇吃掉最弱蛇后一定最终存活。
因此理性地说,它一定会吃。
五、危险步会形成连续尾段
下面证明:
若某一步是危险步,则之后直到剩下
条蛇为止,每一步都是危险步。
设某个强制状态为
设这一步是危险步。即最强蛇
成为下一状态中的最弱蛇。
于是
下一状态中,最强蛇是原来的
强制下一步会令
其体力为
由于
所以
若严格小于
唯一需要处理的是等号情形。
等号成立当且仅当
也就是说,当前状态中前两条蛇体力相同,后两条蛇体力也相同。
由核心不变量,
而
所以即使体力相同,
因此下一步也是危险步。
于是,一旦某个
所以危险步若出现,必定形成一个连续尾段:
其中
表示强制过程中还有
注意
六、理性游戏中的决策
现在考虑真正的理性游戏。
强制过程给出一串状态
真正游戏只可能沿着这条强制路径走,直到某一步当前最强蛇拒绝为止。
记
表示:在状态
我们已经证明:
若
特别地,
因为吃完只剩自己。
现在考虑危险步。
若
因此它是否能存活,完全取决于
- 若
中的最强蛇吃,则它立刻被吃死; - 若
中的最强蛇拒绝,则游戏立即停止,它存活。
所以对于危险步,有
七、最终存活数量为奇数
分两种情况。
情况 1:强制过程中没有危险步
那么每一步都是安全步。
由安全步结论,每一步当前最强蛇都会吃。
于是游戏一直进行到只剩一条蛇。
最终存活数量为
是奇数。
情况 2:强制过程中存在危险步
设第一个进入危险尾段的状态是
也就是说:
全是危险步,而所有
都是安全步。
因此真正游戏一定会先走到
在危险尾段中,有
且对
所以
依此类推。
即:
因此:
若
若
结论
无论强制过程中是否出现危险步,真正理性游戏结束时的存活蛇数量都一定为奇数。
因此原命题成立: