威佐夫博弈探索纪实。
由于是纪实,所以看起来可能很下饭,请勿嘲讽——水平低的人也是有自尊的。
有两堆石子,各有 \(n,m\) 个。双方每轮可以从任意一堆拿任意个,或从两堆分别拿 \(x,y\) 个,满足 \(|x-y|\leq k\),不能不拿。无法操作者败,问先手必胜关于 \(n,m,k\) 的充要条件。
考虑 P/N 态 DP,打个表先。打表的方式为固定 \(k\),打出对于较小 \(n,m\) 的 01 矩阵,便于观察。
初步观察得到以下几个事实:
- 极大多数位置都是必胜。
- 必败态的格子除开 \((0,0)\) 外分为两半,关于主对角线对称。上三角的那一半,必败态的行列号分别严格递增,将它们依次连起来,酷似一条直线。
- 列号的增加速度总是高于行号的增加速度。当 \(k\) 递增时,列号的增加速度在增加,行号的增加速度变化不明显。
一个自然的想法是研究上三角的必败态位置集合,记为 \(\{(a_i,b_i)\}_{i\geq 1}\)。考虑将 \(a,b\) 当作数列研究,将它们以及它们的差分序列同时打出来,容易发现以下结论:
- \((\Delta b)_i=(\Delta a)_i+k+1\)。这就是说,\(b_i=a_i+(k+1)i\)。
- \(\Delta b\) 中只有 \(1,2\) 两种元素,且相邻两个 \(2\) 之间 \(1\) 的数量要么是 \(k\),要么是 \(k+1\)。
如果我们能找到 \(\Delta b\) 相邻两个 \(2\) 之间 \(1\) 的数量的规律,那就做完了。而当你兴高采烈地再打出 \(\Delta b\) 的 \(1\) 的连续段长度序列时,发现又是个类似 \(\Delta b\) 的,极差为 \(1\) 且较小值连续段长度极差也为 \(1\) 的序列。继续递归下去,永无止境,毫无规律。找规律题就是这样,哪儿有什么顺风顺水的,你要做的就是别在一棵树上吊死,多睁眼看世界。
事实上,差分序列满足极差为 \(1\),这就暗示我们这其实是由某个实数的整数倍下取整所生成的序列。而找不到规律,便多半是无理数,因为有理数总会形成周期。但鉴于这没有那么显然,选手做题时有概率意识不到,姑且当作后话,此处略去不谈。
另一方面,我们考虑将 \((a_i,b_i)\) 们连接所得的近似直线的斜率。但由于是小数,收敛也比较慢,难以发现规律。
至此,基于 01 矩阵的几何直观已经被挖掘的差不多了。接下来尝试增大形式化程度地推导。
观察 DP 式,由于是 P/N 态 DP,它的形式只是一个集合的 mex。而 mex 容易转化为一个类似筛法的过程:每确定一个必败态 \((u,v)\),都将 \((u+x,v)\)、\((u,v+x)\)、\((u+x,v+y)\) 其中 \(|x-y|\leq k\),这些格子标记一下,再选取最上、最左的没有被标记的位置,作为下一个确定的必败态。
进行一些手玩,立刻又可以发现一些结论:
- 每行 / 列都最多有一个必败态。因为考虑第一个必败态,它会标记该行 / 列以后的格子。事实上这已经通过几何直观差不多看出来了。
- 自然会考虑:每行 / 列是否至少有一个必败态,这样结合上条,就可以改为「恰好」。尝试证明,是简单的:一行有无限个格子,而除非横着标记,竖着和类似 band-matrix 的斜着标记只会影响本行有限个格子,不可能覆盖完。
由于已经确定每行恰好有一个必败态,我们立刻可以将二维转化为一维:记 \(f_i\) 为第 \(i\) 行的必败态的列号。由对称性有 \(f_{f_i}=i\)。这样就可以知道:全体正整数在所有必败态的行号集合中都恰好出现一次,列号也是如此。所以 \(f\) 是 \(\N_+\) 的一个置换。不妨考虑其置换环,显然是若干个二元环 \(i\to f_i\to f_{f_i}=i\)。可以发现,所有 \((i,f_i)\) 无序对就是之前提到的 \(\{(a_j,b_j)\}\)。
此时我们对 \(\{(a_i,b_i)\}\) 的性质已经有了更多的了解,可以尝试再回过头来解 \(a_i\) 的通项。受 mex 形式的影响,依直觉考虑增量求解,如果已知 \(a_{1\sim i-1}\)(由 \(b_j=a_j+(k+1)j\),其实也确定了 \(b_{1\sim i-1}\)),考虑 \(a_i\) 显然是剩下未确定的数中最小的,立刻有 \(a_i=\operatorname{mex}(\{0\}\cup\{a_{1\sim i-1}\}\cup\{b_{1\sim i-1}\})\)。
至此,我们已经得到了 \(a,b\) 的递推式。对某个固定的 \(k\),容易在 \(\mathrm O(n)\) 时间内求解 \(a,b\) 的前 \(n\) 项,在题目中足以获得不错的分数。至于通项,那属实有点 magic 的成分了,姑且当作知识学习吧,正所谓思而不学则殆。另一方面来看,直到当前这一步,以上观察和推导其实都是相对平凡的,只要你真的认真去推了。
接下来是 magic 的部分。参考《具体数学》第 3.2 章末尾。
定义正实数 \(x\) 的谱 \(S(x)=\{\lfloor kx\rfloor\}_{k\geq 1}\),可以将其看作序列,也可以看作可重集,这是等价的,因其非严格递增。
显然,没有任何两个谱是相同的。因为对于 \(x<y\),显然存在足够大的 \(k\) 使得 \(\lfloor kx\rfloor<\lfloor ky\rfloor\)。
我们定义两个谱 \(S(x),S(y)\) 是 \(\N_+\) 的一个划分,当且仅当 \(S(x)\sqcup S(y)=\N_+\),其中 \(\sqcup\) 是无交并。
我们要检查一个可重集是否等于 \(\N_+\),只要看其 counter array 是否全为 \(1\)。而对于整除,不等号处理显然是容易的,于是我们取 counter array 的前缀和,那么只需对每个 \(n\in\N_+\) 检查不超过 \(n\) 的数量是否为 \(n\)。
考虑一个谱 \(S(x)\) 不超过 \(n\) 的数量 \(N(x,n)\):
Beatty 定理指出:对于两个无理数 \(x,y\),若 \(1/x+1/y=1\),则 \(S(x),S(y)\) 形成 \(\N_+\) 的划分。
证明:只要证 \(\lceil (n+1)/x\rceil-1+\lceil (n+1)/y\rceil-1=n\)。由于是无理数,那么取整号内的数一定不是整数,可以做一步化简:\(\lfloor(n+1)/x\rfloor+\lfloor(n+1)/y\rfloor=n\)。为了应用 \(1/x+1/y=1\) 的条件,考虑拆开整除:\((n+1)/x+(n+1)/y-\{(n+1)/x\}-\{(n+1)/y\}=n\)。前两项显然为 \(n+1\),后两项小数部分之和显然在 \((0,2)\) 内,而 LHS 是整数,所以小数部分之和一定为 \(1\),等式得证。
对于威佐夫博弈,由于 \(a,b\) 是 \(\N_+\) 的划分,于是尝试构造无理数 \(x,y\) 满足 \(1/x+1/y=1\),使得 \(S(x)=a,S(y)=b\)。列出方程 \(\lfloor ix\rfloor+(k+1)i=\lfloor iy\rfloor\)。两边小数部分相同,于是可以去掉取整,得到 \(y=x+k+1\),于是 \(1/x+1/(x+k+1)=1\),解得 \(x=(1-k+\sqrt{k^2+2k+5})/2\)。到这儿已经做完了。
纵观全文,发现有一个由观察得到的关键性质 \(b_i=a_i+(k+1)i\) 没有予以证明,现在来证一下。至于为什么放到最后,是因为一个 OIer 不需要会证明,观察、推导、猜想和打表足矣。
考虑对 \(i\) 归纳。此时 \(a_{1\sim i-1},b_{1\sim i-1}\) 已经确定,并用递推式算出了 \(a_i\)(\(a\) 的递推式不依赖此结论)。
由于 \(a_i\leq b_i\),所以对 \(j<a_i\),\((a_i,j)\) 都是必胜态。
对 \(j\in[a_i,a_i+(k+1)i)\),显然 \((a_{i-1},b_{i-1})\) 能通过斜着标记覆盖到 \((a_i,j)\),也是必胜态。
这样,不会有必败态横着覆盖到 \((a_i,a_i+(k+1)i)\)。竖着显然也不会,因为易证在 \(\{a_{1\sim i-1}\},\{b_{1\sim i-1}\}\) 内出现过的数都小于 \(a_i+(k+1)i\)。接下来只要证斜着也不会覆盖到即可。
格子 \((x_1,y_1)\) 能斜着覆盖 \((x_2,y_2)\),仅当 \(|(x_1-y_1)-(x_2-y_2)|\leq k\)。而对 \(j\in[1,i-1]\),\(a_j-b_j\) 或 \(b_j-a_j\) 最大只能到 \((k+1)(i-1)\),于是不可能覆盖 \((a_i,a_i+(k+1)i)\)。至此,已经得证。