博弈题目(二)
博弈题目(二)
S-NIM
思路
我看了半天什么XOR的,最后告诉我不用这个信息?光理解题意理解半天,最后发现是最基本的SG函数。不过也遇到坑了,就是f[]数组一定要排序,是递增序列。OJ后台输入和输出的数据是分开的,所以输出结果可以一个字符一个字符输出。
预处理打表:
1 |
|
dfs 借鉴师哥写的,只是把这个模板记住了。
1 | #include <bits/stdc++.h> |
取石子游戏
思路
典型的威佐夫博弈,真的很奇妙。
学习网址: 威佐夫博弈
1 |
|
取两堆石子
思路
应用威佐夫博弈的思想,不断枚举,判断取完之后是否构成了奇异状态。忘了在赢的时候写1,一直WA。注意输出的格式,我用set存的。这题还有公式解法,以后再补吧。
1 |
|
Being a Good Boy in Spring Festival
思路
考察NIM博弈的理解。如果堆数的异或和为0直接输出0. 否则有 a1^a2^a3^an = k != 0 肯定存在某个ai改变成为ai’ 后,使得 a1^a2^ai‘^an = 0. 我们现在要看看有多少个ai符合这样的条件。看了网上的题解,感觉说的有些模糊,于是我自己又推了一遍。
a1^a2^a3^ai^an = k != 0 //可以得到a1 ^ a2 ^ a3 ^ an(不包括ai) = k^ai
//当我们把ai 变为 ai’ 后
a1^a2^a3^ai’^an = 0 //把上边得到的式子带进来 -> k^ai = ai’
因此只要满足k ^ ai = ai’ 就说明我们可以把ai 变为 ai’后 就有异或和为0的局面了。 而这个ai’只要满足 ai’ <= ai即可。
1 |
|