首先,计算nim函数,nim(x)= x mod 3。
如果拿到最后一个算赢,那么n堆球就是把上述函数用异或一下即可,结果为0则先行必输,否则先行必胜。
如果拿到最后一个算输,基本上仍然是上述结论。但是需要另外计算一个状态集:
0. 这个状态集是一层一层计算的,每层是0状态和非0状态交替;
1. 这个状态集的起始状态是(1);
2. 附加一条显然的规则:任何一个状态,加上(1,1)是等价状态。
计算方法大概是这样的:
从非0状态层计算0状态层:把每个非0状态的前驱状态计算一下,如果其值是0,则放入0状态层。
从0状态层计算非0状态层:把每个0状态的前驱状态计算一下,这个状态要满足两个要求:
a. 能得到的0状态必须已经在状态集中。
b. 不能得到状态集中的任何一个非0状态。