翻硬币游戏
一般的翻硬币游戏的规则是这样的:
N 枚硬币排成一排,有的正面朝上,有的反面朝上。我们从左开始对硬币按1 到N 编号。
第一,游戏者根据某些约束翻硬币,但他所翻动的硬币中,**最右边那个硬币的必须是从正面翻到反面。**例如,只能翻3个硬币的情况,那么第三个硬币必须是从正面翻到反面。如果局面是正正反,那就不能翻硬币了,因为第三个是反的。
第二,谁不能翻谁输。
有这样的结论:局面的SG 值为局面中每个正面朝上的棋子单一存在时的SG 值的异或和。即一个有k个硬币朝上,朝上硬币位置分布在的翻硬币游戏中,**SG值是等于k个独立的开始时只有一个硬币朝上的翻硬币游戏的SG值异或和。比如THHTTH这个游戏中,2号、3号、6号位是朝上的,它等价于TH、TTH、TTTTTH三个游戏和,即sg[THHTTH]=sg[TH]⨁sg[TTH]⨁sg[TTTTTH].**我们的重点就可以放在单个硬币朝上时的SG值的求法。
约束条件一:每次只能翻一个硬币。
一般规则中,所翻硬币的最右边必须是从正面翻到反面,因为这题是只能翻一个硬币,那么这个硬币就是最右边的硬币,所以,每次操作是挑选一个正面的硬币翻成背面。
对于任意一个正面的硬币,SG值为1。
有奇数个正面硬币,局面的SG值 == 1,先手必胜,有偶数个正面硬币,局面的SG值 == 0,先手必败
约束条件二:每次能翻转一个或两个硬币。(不用连续)
每个硬币的SG值为它的编号,初始编号为1,可以转化为NIM游戏
如果对于一个局面,把正面硬币的SG值异或起来不等于0,既a1 ^ a2 ^ a3 ^ … ^ an == x,
那么玩家必然可以通过翻转一个或两个硬币使得异或和为0
证明:不妨设x的二进制表示中最高一位1在第k位,那么在a1,a2,…,an中,必然有一个数ai,它的第k位是1,且ai’ = ai ^ x<ai,
如果 ai’ == 0,意思就是说&#x