这个标题仅用于表示我看博弈论的心情。
类$dp:$当转移图可以写为网格时(或网格的一部分),总之就是只要满足$SG(i,j)=mex(SG(i,j-1),SGT(i-1,j))$,那么有结论:
除了边框上的行列外,其余部分有$SG(i,j)=SG(i-1,j-1)$
这样只要能在合理的复杂度内求出边框上的所有点就可以直接得到所有局面的答案了。
$SG:$
当一个游戏可以拆分成若干子游戏,且子游戏之间互相独立,那么整局游戏的$SG(G)=sumlimits_{g in subgame(G)}^{xor} SG(g)$
如果一个局面经过若干种不同决策之后得到若干局面,那么当前局面的$SG(S)=mex(SG(suc))$
翻硬币:
大意:树,每个节点有硬币,每次可以选择一个正面的,将它翻转,同时将其子树选择一个子集进行翻转,不能操作者负。
一个点的$SG$是所有后代的所有子集的$mex$。叶节点是$1$。归纳可得,$SG(p)=2^{deep}$。$deep$是子树内最大深度到当前点的距离。
然后初状态所有向上的硬币就是若干子游戏,异或起来就好了。
砍树游戏:
大意:树,每次砍一条边,只保留根所在的部分,不能操作者负。
这道题里关键在边上。对于每个节点,所有儿子方向的边(也就是每个子树,再加上这个父亲)都是一个子游戏。
问题在于在已知$SG$的子树,再它上面加一个父亲之后的边之后的$SG$。
画出转移图,发现所有点的出边都多了一个:砍掉这条父亲边。那么所有$SG=0$的点变成了$1$,$1$变成了$2$也就是都$+1$
加强:树变成任意无向图。
每一个边双都可以缩成菊花。(可以模拟,难证
CCQ 2019 qhd I:
大意:有根树,每次可以删掉一部分叶子节点删掉根者胜。(类似拓扑
打表。
如果是一条链,决策唯一,只与长度奇偶有关。
如果是一条链,中间有个地方产生了一个分支伸出去了一个节点,那么先手在删掉这个节点的同时,可以控制主链的奇偶,必胜。
如果是一条链,中间有个地方产生了一个分支伸出去了长度为$2$的链,那么谁都不想碰到它,不然就会把上面这个必胜局面交给对手。
于是取决于主链在分叉以下的长度。若为偶数则必败。否则必胜。
如果是一条链,中间有个地方产生了一个分支伸出去了长度为$3$的链,那么先手在删掉一个节点的同时,可以控制主链在分叉一下部分的剩余长度的奇偶。必胜。
以此类推。再多加分叉也一样。结论是:如果所有叶子到最近的分叉的长度都是偶数,必败,否则必胜。
Anti-SG:
大意:当所有子局面的$SG=0$时游戏结束。操作者失败。先手必胜当且仅当:
1)整个游戏的$SG>0$,且某个单一子游戏$SG>1$。
2)整个游戏的$SG=0$,且所有单一子游戏$SG le 1$。
听他说可以归纳。
nim积:
没有比这个更好的博客啦:https://www.cnblogs.com/zjp-shadow/p/10507030.html
没什么必要说太多,看就是了。
然而在机房可能打不开。
常用于高维而互相独立的$nim$博弈。对每一维求出$SG$之后直接$nim$积起来就好了。
总之,在博弈论里,加就是异或,乘就是$nim$积。
而实现的时候可以采取$8$位一打表的策略,复杂度大概就和$O(log)$一样了。(具体实现不会
PE459:
大意:棋盘,初始全白,每次可以选择一个白点作为右上角,以完全平方数为长以三角形数为宽的矩形全部取反。不能操作为负。
求问第一步有多少种必胜操作。$n,m le 10^5$
也是翻硬币游戏模型,整个局面的$SG$就是每个点$SG$的异或和。
每个点的$SG4就是它在它所在行和所在列的$SG$的$nim$积。
因为$nim$积有分配律,所以$SG(G)=sumlimits_{i=1}^{n} sumlimits_{j=1}^{m} SG(i,j)$
$ = SG(G)=sumlimits_{i=1}^{n} sumlimits_{j=1}^{m} row(i) imes col(j) $
$= SG(G)=(sumlimits_{i=1}^{n} row(i)) imes (sumlimits_{j=1}^{m} col(j))$
这个式子看起来很显然,但是里面的求和是异或和,乘法是$nim$积。然而由于交换律,结合律与分配律,所以依旧成立。
平方数,三角形数都是$O(nsqrt{n})$级别的。由于求$nim$积是$O(log n)$的所以勉强可接受。
求出整个局面的$SG$之后只要我们找到所有$SG$值与之相同的矩形,那么第一步只要翻转这个矩形就好了。
然而矩形个数很多,$(l,r)$有$O(nsqrt{n})$种,$(u,d)也是$。乘起来就算不出来了。
$T= (sumlimits_{i=l}^{r} row(i) ) imes (sumlimits_{i=u}^{d} col(i) )$。我们要求有多少$S=T$
然而,每个节点的后继个数至多也就是$O(sqrt{n})$的。所以$mex,SG$值也就是这个级别。
所以只要开一个桶记录$SG=x$的$(l,r)/(u,d)$有$buc[x]$个就好了。这里是$O(nsqrt{n}log n)$的了。可过了。
模拟测试55T2。常用套路。
cf 102341 L
大意:求异或为加$nim$积为乘的行列式。
$nim$积是一个大小为$2^{2^n}$的乘法域。故存在逆元。
一个乘法群,我们能知道$x^{|A|}=1$。那么逆元就是$x^{|x|-1}$
用$nim$积快速幂就行了。或者也可以高斯消元。
有了逆元就可以高斯消元算行列式了。
cf 1314 F Bad Cyptography
大意:求$nim$积意义下的离散对数。$2^{64}$
即给定$a,b$求$x$满足$a^xequiv b$
$10^9$可以直接$BSGS$
乘法群里的这个东西,它也有原根$g$。
$g^sequiv a,g^t equiv b ightarrow sx equiv b (mod2^{64}-1)$
于是只要随机几个数看是不是原根
判原根和素数一样但是我两种都不会:将$mod-1$分解质因数然后看$g^{frac{mod-1}{p_i}}$是否都不是$1$。
分解之后对于每个质因子$BSGS$啥的然后弄个$CRT$大概就是了
$O(sum sqrt{p_i})$
$Infinity Nimber:$
无穷博弈。高维棋盘上,当其中一维数字减小时,更低的维度的数字可以任意变化。
那么$SG(0,0...0,0,x)=x$这很明显。$SG(0,0...0,x,y)$的$SG$值就是正无穷了。我们设无穷的记号是$w$。
那么当前点的$SG$值可以表示为$xw^1+yw^0$
任意点都可以表示为$sumlimits_{i=0}^{n-1} x_i w^{n-i-1}$(求和还是指异或和
这样如果有多个子游戏依旧可以异或起来,如果各项系数都$=0$就有先手必败。
CF1149E:
大意:DAG,每次可以选择一个权值大于$0$的点,减小这个点权值,修改所有出边的权值,不可操作败。输出先手必胜策略。
每个点都是独立子游戏。每个点的$SG$值是$xw^{M(p)}$。$M(x)=mex(M(suc))$
然后每一位异或就行了。