思路:简单Nim博弈,只需要将所给的数字全部进行异或,结果为0,则先手必败。否则必胜。知道方法的人1分钟写完代码,不知道的人研究几小时都难写。 1 #include 2 using namespace std; 3 int main() 4 { 5 //freopen("input.txt...
分类:
其他好文 时间:
2015-05-12 13:01:04
阅读次数:
101
ZOJ 3591Nim(Nim博弈)题目意思是说有n堆石子,Alice只能从中选出连续的几堆来玩Nim博弈,现在问Alice想要获胜有多少种方法(即有多少种选择方式)。方法是这样的,由于Nim博弈必胜的条件是所有数的抑或值不为0,证明见 点击 ,所以答案就转化为原序列有多少个区间的亦或值为0,用n*...
分类:
其他好文 时间:
2015-05-10 20:20:52
阅读次数:
152
切切水题,放松心情:-D 1 #include 2 3 const int maxn = 200000 + 10; 4 int a[maxn]; 5 6 int main() 7 { 8 //freopen("in.txt", "r", stdin); 9 10 int m;1...
分类:
其他好文 时间:
2015-04-28 16:04:14
阅读次数:
104
博弈的题目,打表找规律还是相当有用的一个技巧。这个游戏在原始的Nim游戏基础上又新加了一个操作,就是游戏者可以将一堆分成两堆。这个SG函数值是多少并不明显,还是用记忆花搜索的方式打个表,规律就相当显然了。 1 #include 2 #include 3 4 const int maxn = 1...
分类:
其他好文 时间:
2015-04-21 14:16:41
阅读次数:
131
考虑到Bouton定理的证明过程,设n个数的Nim和(异或和)为X,其最高位的1在第k位,那么n个数中一定有个y的第k为也是个1.将y的数量变为X xor y,那么n的数的Nim和为0,便转为先手必败局面。所以先手有多少种取法,就看n个数里面有多少个y,满足二进制的第k为是个1。 1 #includ...
分类:
编程语言 时间:
2015-04-11 20:37:06
阅读次数:
189
//必胜局面是所有的黑子和白子都相邻,
//本题想要达到黑子和白子之间都相邻,即走完它们之间的所有空格
//就相当于一个NIM博弈
#include
#include
#include
using namespace std ;
int main()
{
// freopen("in.txt","r",stdin) ;
int n , m ;
int t...
分类:
其他好文 时间:
2015-04-11 14:54:50
阅读次数:
111
//当该点时p-position时,先手输
//当该点为n-position时,即a1^a2......^an = k时;
//先手的第一步是使得a1^a2^.......^an^k = 0;
//那么只要ai^k
#include
#include
#include
using namespace std ;
const int maxn = 10000010 ;
int n...
分类:
编程语言 时间:
2015-04-10 09:41:33
阅读次数:
157
题目链接:ZOJ 3591 Nim
题意:根据题目给出的代码得到n堆石头的各自的数量,求先手选出连续的若干堆并且必胜的方法数。(比如:3,1,1 每堆石头数是1,1,1.先手选出(1),(1),(1),(1,1,1) 这四种方案是必胜的,所以答案是4)
思路:在n堆取石头首先想到的是Nim博弈,连续的若干堆,即求连续子序列异或和为0的数量m,n*(n+1)/2-m就是答案
(Nim博弈结论,...
分类:
其他好文 时间:
2015-04-09 09:03:59
阅读次数:
136