关于博弈论的问题

对于博弈论的问题

我们先考虑自己总结的两类简单问题:

1.如果是1堆,A,B两个人开始取,每次能取的数目为1~m,那么我作为A先手,要保证赢的话,我该怎么取。

这样的问题,因为每次能保证两人取到的和(m+1)固定,因此我先手的情况下,我要考虑取1次后,当前n能够被(m+1)整除,这样的话我一定能够获胜。因此,一般会问两种:判断我能否赢或者我该怎么赢,我直接n%(m+1),如果有余数,那么我直接取余数我就一定赢;如果余数为0,判断我先手一定能赢。

2.如果是n堆,例如是3堆,每堆是10个,并且我先手的情况下,我能最多取其中的一堆,并且同时只能在一堆当中取,要怎样保证我能赢。

这样的问题,我们首先要明白一点,但凡是a1^a2^a3^……^an=0的情况,后手的人一定赢,因此我要做的就是怎么样取一次,保证剩下的所有异或和为0。那么就要考虑二进制,比如题目所给,三个都是1010,要保证异或为0,在第1为以及第3为不行,需要转化为0,那么我们就考虑在最高位需要改变的那堆里进行取值,此时1010-0000(目标)=1010,也就是10,因此我们需要在一堆中取10,这样的话我们就能保证开始提到的,异或为0且我们是后手进行,必赢。

那么再推广一下,如果是10,11,12的三堆呢,同样的,转化为二进制,1010,1011,1100,那么我们看到,在第二位以及最后以为是不满足要求的,我们需要在最高位需要改变的那堆中进行修改,因此也就是12的那堆中,我们的目标是变为0001,因此我们需要拿走的就是1100-0001也就是11个。

关于具体的其他变种问题,以及较为详细的证明,需要用到SG函数的概念,可以看下面的博客:

https://blog.csdn.net/A_Comme_Amour/article/details/79347291

猜你喜欢

转载自blog.csdn.net/qq_26896213/article/details/82943145