威佐夫博弈探索纪实。

由于是纪实,所以看起来可能很下饭,请勿嘲讽——水平低的人也是有自尊的。


有两堆石子,各有 n,m 个。双方每轮可以从任意一堆拿任意个,或从两堆分别拿 x,y 个,满足 |xy|k,不能不拿。无法操作者败,问先手必胜关于 n,m,k 的充要条件。

考虑 P/N 态 DP,打个表先。打表的方式为固定 k,打出对于较小 n,m 的 01 矩阵,便于观察。

初步观察得到以下几个事实:

  • 极大多数位置都是必胜。
  • 必败态的格子除开 (0,0) 外分为两半,关于主对角线对称。上三角的那一半,必败态的行列号分别严格递增,将它们依次连起来,酷似一条直线。
  • 列号的增加速度总是高于行号的增加速度。当 k 递增时,列号的增加速度在增加,行号的增加速度变化不明显。

一个自然的想法是研究上三角的必败态位置集合,记为 {(ai,bi)}i1。考虑将 a,b 当作数列研究,将它们以及它们的差分序列同时打出来,容易发现以下结论:

  • (Δb)i=(Δa)i+k+1。这就是说,bi=ai+(k+1)i
  • Δb 中只有 1,2 两种元素,且相邻两个 2 之间 1 的数量要么是 k,要么是 k+1

如果我们能找到 Δb 相邻两个 2 之间 1 的数量的规律,那就做完了。而当你兴高采烈地再打出 Δb1 的连续段长度序列时,发现又是个类似 Δb 的,极差为 1 且较小值连续段长度极差也为 1 的序列。继续递归下去,永无止境,毫无规律。找规律题就是这样,哪儿有什么顺风顺水的,你要做的就是别在一棵树上吊死,多睁眼看世界。

事实上,差分序列满足极差为 1,这就暗示我们这其实是由某个实数的整数倍下取整所生成的序列。而找不到规律,便多半是无理数,因为有理数总会形成周期。但鉴于这没有那么显然,选手做题时有概率意识不到,姑且当作后话,此处略去不谈。

另一方面,我们考虑将 (ai,bi) 们连接所得的近似直线的斜率。但由于是小数,收敛也比较慢,难以发现规律。

至此,基于 01 矩阵的几何直观已经被挖掘的差不多了。接下来尝试增大形式化程度地推导。

观察 DP 式,由于是 P/N 态 DP,它的形式只是一个集合的 mex。而 mex 容易转化为一个类似筛法的过程:每确定一个必败态 (u,v),都将 (u+x,v)(u,v+x)(u+x,v+y) 其中 |xy|k,这些格子标记一下,再选取最上、最左的没有被标记的位置,作为下一个确定的必败态。

进行一些手玩,立刻又可以发现一些结论:

  • 每行 / 列都最多有一个必败态。因为考虑第一个必败态,它会标记该行 / 列以后的格子。事实上这已经通过几何直观差不多看出来了。
  • 自然会考虑:每行 / 列是否至少有一个必败态,这样结合上条,就可以改为「恰好」。尝试证明,是简单的:一行有无限个格子,而除非横着标记,竖着和类似 band-matrix 的斜着标记只会影响本行有限个格子,不可能覆盖完。

由于已经确定每行恰好有一个必败态,我们立刻可以将二维转化为一维:记 fi 为第 i 行的必败态的列号。由对称性有 ffi=i。这样就可以知道:全体正整数在所有必败态的行号集合中都恰好出现一次,列号也是如此。所以 fN+ 的一个置换。不妨考虑其置换环,显然是若干个二元环 ififfi=i。可以发现,所有 (i,fi) 无序对就是之前提到的 {(aj,bj)}

此时我们对 {(ai,bi)} 的性质已经有了更多的了解,可以尝试再回过头来解 ai 的通项。受 mex 形式的影响,依直觉考虑增量求解,如果已知 a1i1(由 bj=aj+(k+1)j,其实也确定了 b1i1),考虑 ai 显然是剩下未确定的数中最小的,立刻有 ai=mex({0}{a1i1}{b1i1})

至此,我们已经得到了 a,b 的递推式。对某个固定的 k,容易在 O(n) 时间内求解 a,b 的前 n 项,在题目中足以获得不错的分数。至于通项,那属实有点 magic 的成分了,姑且当作知识学习吧,正所谓思而不学则殆。另一方面来看,直到当前这一步,以上观察和推导其实都是相对平凡的,只要你真的认真去推了。


接下来是 magic 的部分。参考《具体数学》第 3.2 章末尾。

定义正实数 x 的谱 S(x)={kx}k1,可以将其看作序列,也可以看作可重集,这是等价的,因其非严格递增。

显然,没有任何两个谱是相同的。因为对于 x<y,显然存在足够大的 k 使得 kx<ky

我们定义两个谱 S(x),S(y)N+ 的一个划分,当且仅当 S(x)S(y)=N+,其中 是无交并。

我们要检查一个可重集是否等于 N+,只要看其 counter array 是否全为 1。而对于整除,不等号处理显然是容易的,于是我们取 counter array 的前缀和,那么只需对每个 nN+ 检查不超过 n 的数量是否为 n

考虑一个谱 S(x) 不超过 n 的数量 N(x,n)

N(x,n)=k1[kxn]=k1[kx<n+1]=|[1,(n+1)/x)N|=(n+1)/x1

Beatty 定理指出:对于两个无理数 x,y,若 1/x+1/y=1,则 S(x),S(y) 形成 N+ 的划分。

证明:只要证 (n+1)/x1+(n+1)/y1=n。由于是无理数,那么取整号内的数一定不是整数,可以做一步化简:(n+1)/x+(n+1)/y=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,bN+ 的划分,于是尝试构造无理数 x,y 满足 1/x+1/y=1,使得 S(x)=a,S(y)=b。列出方程 ix+(k+1)i=iy。两边小数部分相同,于是可以去掉取整,得到 y=x+k+1,于是 1/x+1/(x+k+1)=1,解得 x=(1k+k2+2k+5)/2。到这儿已经做完了。


纵观全文,发现有一个由观察得到的关键性质 bi=ai+(k+1)i 没有予以证明,现在来证一下。至于为什么放到最后,是因为一个 OIer 不需要会证明,观察、推导、猜想和打表足矣。

考虑对 i 归纳。此时 a1i1,b1i1 已经确定,并用递推式算出了 aia 的递推式不依赖此结论)。

由于 aibi,所以对 j<ai(ai,j) 都是必胜态。

j[ai,ai+(k+1)i),显然 (ai1,bi1) 能通过斜着标记覆盖到 (ai,j),也是必胜态。

这样,不会有必败态横着覆盖到 (ai,ai+(k+1)i)。竖着显然也不会,因为易证在 {a1i1},{b1i1} 内出现过的数都小于 ai+(k+1)i。接下来只要证斜着也不会覆盖到即可。

格子 (x1,y1) 能斜着覆盖 (x2,y2),仅当 |(x1y1)(x2y2)|k。而对 j[1,i1]ajbjbjaj 最大只能到 (k+1)(i1),于是不可能覆盖 (ai,ai+(k+1)i)。至此,已经得证。

posted @   ycx060617  阅读(444)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示