hihocoder1163 nim博弈
2015-09-07 21:58
253 查看
点击查看题目
定义P为先手必败,N为先手必胜。
若A[1] = 0,那么先手的必输。若A[1] != 0 那么先手必胜。
若假设对于一个局面,当且仅当A[1] xor A[2] xor … xor A
= 0时,该局面为P局面。
那么若A[1] xor A[2] xor … xor A
xor A[n+1] = 0那么A[n+1] == 0,不符合题意。
若A[1] xor A[2] xor … xor A
xor A[n+1] != 0,那么先手如果当前状态是N同样能证明假设。若先手取掉所有的A[n+1] 那么 A[1] xor A[2] xor … xor A
= 0,这时候就有第二个人必输,这时候先手就赢了,也就是说如果当前的所有A异或和等于零那么你怎么取都不能使得下一个人取的时候所有的异或和为0,也就是你下一个人必然是N态,如果先手异或和不是零,那么你总有一种方法使得你取出来其中的一堆中的部分使得其它数异或和变为0,这就是下一个人必输态。
[code]#include <cstdio> #include <iostream> using namespace std; int main(){ int n; cin >> n; int x = 0; for(int i = 0;i < n;i++){ int a; cin >> a; x ^= a; } if(x == 0){ cout << "Bob" << endl; } else{ cout << "Alice"<< endl; } return 0; }
定义P为先手必败,N为先手必胜。
若A[1] = 0,那么先手的必输。若A[1] != 0 那么先手必胜。
若假设对于一个局面,当且仅当A[1] xor A[2] xor … xor A
= 0时,该局面为P局面。
那么若A[1] xor A[2] xor … xor A
xor A[n+1] = 0那么A[n+1] == 0,不符合题意。
若A[1] xor A[2] xor … xor A
xor A[n+1] != 0,那么先手如果当前状态是N同样能证明假设。若先手取掉所有的A[n+1] 那么 A[1] xor A[2] xor … xor A
= 0,这时候就有第二个人必输,这时候先手就赢了,也就是说如果当前的所有A异或和等于零那么你怎么取都不能使得下一个人取的时候所有的异或和为0,也就是你下一个人必然是N态,如果先手异或和不是零,那么你总有一种方法使得你取出来其中的一堆中的部分使得其它数异或和变为0,这就是下一个人必输态。
相关文章推荐
- BZOJ 1934: [Shoi2007]Vote 善意的投票 最小割
- ConcurrentModificationException异常解决
- Java Io 字符流
- Linux/Mac/Windows换行符及对'\r'和'\n'的不同处理
- Codeforces Bubble Cup 8 - Finals [Online Mirror] 解题报告
- Android学习总结(一)
- Windows QT下OpenCV的配置
- java移动占位符<<;>>d的实现原理
- 转: Jenkins+Gradle实现android开发持续集成、打包
- Spring整合Redis
- C语言打印16进制出现0xffffff现象的问题剖析!
- Gray Code
- 【Splay】 HDU 1890 Robotic Sort 翻转
- C++ 大数处理
- css定位浮动 &html 严格模式混杂模式
- 在linux 配置matlab的 libsvm
- 关于oracle批量插入数据遇到的问题
- UVA-10003 Cutting Sticks (区间DP)
- 不需要配置path,eclipse启动指定jdk
- java的三大特性之一封装讲解与实例