令非负整数集为全集,集合G(x)表示集合g(x)的补集。 定义函数f(n):f(n)=min{G(n)},即f(n)等于集合G(n)中的最小数。 设局面S=(a1, a2, …, an),#S=f(a1)+f(a2)+…+f(an),采用二进制数的加法。 *若#S≠0,则先行者有必胜策略;若#S=0,则后行者有必胜策略。
我们规定,对于每堆石子\(G_i\),对应的\(SG(G_i)=SG(x)\),其中\(x\)是该堆石子最初的数量。 结合这棵树: 从\(SG\)函数可以看出,当先手进行决策后,对应的的\(SG\)函数值可以为\([0,SG(x)-1]\),这恰好就像我们最初讨论的普通的Nim问题中取石子的规则! 在这里,我们将\(SG\)函数值看成是普...
1. 对每个状态,计算它的所有可能转移的后继状态。 2. 计算这些后继状态的SG值,并将SG值取为0开始,寻找使得所有后继状态的最小非负整数(Mex,minimum excludant)。 3. 使用SG函数判断博弈的结果:如果当前局面SG值为0,则处于必败态;否则为必胜态。 例题: - 可以使用SG函数的格子类博弈,例如某些棋盘类问题(Kn...
int sg[MAXN][MAXM]; bool g(int i,int j) { if (sg[i][j]>=0) return sg[i][j]; if (j==1) return g(i+1,0); sg[i][j]=0; if (i>=1&&!g(i-1,j)) sg[i][j]=1; if (j>=1&&!g(i,j-1)) sg[i][j]=1; if (j) { if (i>=2&&!g(i-2,j+3)) sg[i...
CF 256C Furlo and Rublo and Game【博弈论,SG函数】,暴力的求SG函数会超时,正解是先处理出10^6以内的SG值,对于更大的,开根号之后计算出。小数据观察可以发现sg函数值成段出现,而且增长速度很快,因此可以计算出来每一段的范围,只需打表即可。Nim游戏:Nim和:L.Bout
刚好FWT和SG函数都刚学,这道题也挺模板的,就拉来做做。 手动打个SG函数表发现sg[2k+n]=n+1sg[2k+n]=n+1,然后博弈论就被干掉了,剩下的问题变成,有mm个数可以选,选择vv个数使得异或和为00。 这道题题意有锅吧,正确表述应该是大小为VV的序列,而不是集合,因为方案数跟选取顺序有关。
博弈论 + SG函数 + 分段打表 暴力的求SG函数会超时,正解是先处理出10^5以内的SG值,可以发现sg函数值成段出现. 根据sg函数值成段出现的特点,构造函数sg[lower_bound(a, a+6, i)-a]。 根据10^5以内的SG值,使用该函数,容易计算全部SG值(<=777777777777) ...
博弈+ SG函数 + 状态压缩 先考虑所有数字都是2的倍数的情况,可以很显然的发现如果只有两个2,这样仍然是先手必胜, 显然这样并不是一个nim游戏,因为可以一下子“把两堆石子取走”, 故而同时有多个2^k 和只有一个2^k 的情况是相同的。 一个2和一个16的情况下, 可以考虑 2^(1-1)|2^(4-1)=9 ...
当两端棋子一端是白一端是黑,当空白长度为偶数的时候,后手可以构造一个对称棋盘,其sg函数为0(相当于case1的偶数情况)。但是对于奇数情况,我们也不得而知。 我们目前已经获得了几种显然的条件,接下来就是博弈最美丽的推导。 对于Case 3长度为偶数的情况,也就是两端都是1,中间的长度为偶数。我们可以在最左端(...
(https://cpeditor.org) /** * @author : SDTBU_LY * @version : V1.0.0 * @上联 : ac自动机fail树上dfs序建可持久化线段树 * @下联 : 后缀自动机的next指针DAG图上求SG函数 **/ #include<iostream> #include<cstring> #include<algorithm> #include<vector> #define MAXN 1000010 using namespace...