博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 2197 nim游戏
阅读量:5174 次
发布时间:2019-06-13

本文共 1106 字,大约阅读时间需要 3 分钟。

题目描述

甲,乙两个人玩Nim取石子游戏。

nim游戏的规则是这样的:地上有n堆石子(每堆石子数量小于10000),每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这n堆石子的数量,他想知道是否存在先手必胜的策略。

输入输出格式

输入格式:

第一行一个整数T<=10,表示有T组数据

接下来每两行是一组数据,第一行一个整数n,表示有n堆石子,n<=10000;

第二行有n个数,表示每一堆石子的数量

输出格式:

共T行,如果对于这组数据存在先手必胜策略则输出”Yes”,否则输出”No”,不包含引号,每个单词一行。

输入输出样例

输入样例#1: 复制

2
2
1 1
2
1 0
输出样例#1: 复制
No
Yes

题解

nim游戏,经典博弈论。我们先给出一个结论:对于一个Nim游戏的局面(a1,a2,...,an),它是先手必败当且仅当a1^a2^...^an=0。证明:1、当没有石子时先手显然必败,此时满足0^0^0^…^0=0。    2、当a1^a2^a3^...^an=k (k!=0) 时,则一定存在    某个ai ,使得它的二进制表示在k的最高位上是1,所以我们设ai' = ai^k,(ai'一定小于ai)    此时a1^a2^...^ai'^...^an=a1^a2^a3^...^an^k=0。    3、当a1^a2^...^an=0时,一定不存在某个合法的移动,    将ai变成ai'后满足a1^a2^...^ai'^...^an=0。因为如果这样,    那么a1^a2^...^an=a1^a2^...^ai'^...^an=0。    消去两边,得:ai=ai',这显然不可能。

代码

#include
using namespace std;const int MAXN = 10005;int a[MAXN],T,n;int main(){ scanf("%d",&T); while(T--){ int ans=0; scanf("%d",&n); for(register int i=1;i<=n;i++){ scanf("%d",&a[i]); ans^=a[i]; } if(ans!=0) cout<<"Yes"<

转载于:https://www.cnblogs.com/sdfzsyq/p/9677057.html

你可能感兴趣的文章
12 for循环
查看>>
redis(hash篇)
查看>>
Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏...
查看>>
Hibernate一对多关联
查看>>
python 把函数作为参数 ---高阶函数
查看>>
jQuery + ashx 实现图片按比例预览、异步上传及显示
查看>>
android 代码中使用textAppearance
查看>>
【iOS】UITableViewDelegate 方法没有调用
查看>>
解决code::blocks 17.12不能debug的方法
查看>>
bzoj2961&&bzoj4140 共点圆
查看>>
96:经典实例,判断那一条是闰年:
查看>>
upsource初探
查看>>
让SVN自动更新代码注释中的版本号
查看>>
java中base64
查看>>
常用的mysql操作命令
查看>>
Unity3D的菜单及编辑器扩展
查看>>
我是如何拿到蚂蚁金服 offer 的 ?
查看>>
Android Volley 的基本使用/设置HTTP请求参数、apikey
查看>>
Hibernate框架
查看>>
Vim编辑器的使用总结
查看>>