[hdu1848] Fibonacci again and again
sg函数
sg函数入门题
sg函数定义, 设sg(x)为状态x的sg函数, sg(x)>0则代表x这个状态是必赢点, 若sg(x)=0则代表x这个状态是必败点
sg函数性质, sg(x)=mex{sg(y)} y为x可达的状态点
观察定义就可以知道, 一个点为必胜点当且仅当这个点存在一个可达的状态点都是必败点, 一个点为必败点, 当且仅当所有可达点都是必胜点
根据这个定义可以知道, 为什么sg(x)=0就是必败点(因为所有可达点都是必胜点), 为什么sg(x)>0代表x这个状态是必胜点, 因为可达点的集合中有至少一个必败点
sg定理
更深入的, 有个sg定理, 他能解决组合游戏的并(比如nim游戏)
其表示为, 总状态的sg函数为各个互相独立的子状态的sg函数的异或和
举个例子, 取石子游戏, 一共有n堆石子, 这n堆石子是互相独立的, 那么全部石子的sg函数就是$sg(x_1) \ xor \ sg(x_2)\ ...\ xor \ sg(x_n)$
因为在这一题中, sg(x)=x, 所以最终nim游戏的结论就是$x_1\ xor\ x_2\ xor ...xor \ x_n$
本题题解
对于这道题, 对于一堆石子的$sg(x) = mex{sg(x-f[i])| f[i]\leq x}$
所以对于三堆石子, 只需要把状态异或起来就可以了, 而sg函数可以记忆化搜索求
还是比较好写的
学习链接
博弈论进阶之SG函数 - 自为风月马前卒 - 博客园 (cnblogs.com)
老刘の组合博弈课件