摘要:
为了提高题解质量还是简单证明一下:3的倍数是必败状态。如果n % 3 = 1,那么拿走1个石子;如果n % 3 = 2,那么拿走两个石子,都将转移到3的倍数的状态。所以每个必胜状态都有一个后继是必败状态。如果n % 3 = 0,因为2i里面没有一个是3的倍数,所以不管怎么拿,剩下的石子数n' % 3... 阅读全文
摘要:
如果硬要说这算是博弈题目的话,那这个博弈是不公平博弈(partizan games),因为双方面对同一个局面做出来的决策是不一样的。我们平时做的博弈都是公平博弈(impartial games),所以在这道题里面,那些必胜必败状态,SG函数SG定理都派不上用场了。但是,这道题是可以贪心的。比如第一个... 阅读全文
摘要:
考虑到Bouton定理的证明过程,设n个数的Nim和(异或和)为X,其最高位的1在第k位,那么n个数中一定有个y的第k为也是个1.将y的数量变为X xor y,那么n的数的Nim和为0,便转为先手必败局面。所以先手有多少种取法,就看n个数里面有多少个y,满足二进制的第k为是个1。 1 #includ... 阅读全文
摘要:
没什么好说的,一道水题。 1 #include 2 3 int main() 4 { 5 int n, m; 6 while(scanf("%d%d", &n, &m) == 2) 7 { 8 if(n <= m) 9 {10 ... 阅读全文
摘要:
这道题的结论就是,石子的个数为斐波那契数列某一项的时候,先手必败;否则,先手必胜。结论很简单,但是证明却不是特别容易。找了好几篇博客,发现不一样的也就两篇,但是这两篇给的证明感觉证得不清不楚的,没看太懂。首先,证明要依赖一个邓肯多夫定理(Zeckendorf's Theorem):任何一个正整数一定... 阅读全文
摘要:
根据博弈论的两条规则:一个状态是必胜状态当且仅当有一个后继是必败状态一个状态是必败状态当且仅当所有后继都是必胜状态然后很容易发现从1开始,前p个状态是必败状态,后面q个状态是必胜状态,然后循环往复。 1 #include 2 3 int main() 4 { 5 int n, p, q;... 阅读全文
摘要:
这是由n个巴什博奕的游戏合成的组合游戏。对于一个有m个石子,每次至多取l个的巴什博奕,这个状态的SG函数值为m % (l + 1)。然后根据SG定理,合成游戏的SG函数就是各个子游戏SG函数值的异或和。 1 #include 2 3 int main() 4 { 5 int T, n; ... 阅读全文