首页 > 其他分享 >题解 : Luogu P2197 【模板】nim 游戏

题解 : Luogu P2197 【模板】nim 游戏

时间:2023-01-05 17:55:36浏览次数:63  
标签:... P2197 nim 题解 石子 先手 lt ans oplus

题目链接:link

结论

如果 $ a_1 \oplus a_2 \oplus ... \oplus a_n \not= 0$ ,则先手必胜

证明

  1. 操作到最后时,每堆石子数都是\(0\), \(0 \oplus 0 \oplus ... \oplus 0 = 0\)

  2. 如果\(a_1 \oplus a_2 \oplus ... \oplus a_n = x \not= 0\),那么肯定可以通过从某一堆中拿走若干颗石子后,将异或结果变成0

    证明:我们先假设 x的最高一位的1在第k位,
    那么在 \(a_1,a_2,...,a_n\) 中,一定存在一个 \(a_i\) ,它的第k位为1,
    \(a_i\oplus x\)一定是小于\(a_i\)的,那么在\(a_i\)中取\(a_i-(a_i\oplus x)\)颗石子,就可以得到\(a_1\oplus a_2 \oplus ...\oplus a_n = 0\),
    因为\(a_i\)中取了\(a_i-(a_i\oplus x)\)颗石子后,就还剩\(a_i-(a_i-(a_i\oplus x))\)颗石子,也就是\(a_i\oplus x\)颗

  3. 如果\(a_1\oplus a_2\oplus ...\oplus a_n = 0\),那么无论怎么拿,最终的异或结果一定不为0

    反证法:假设从第i堆石子中拿了若干个,结果仍然为0
    先设第i堆拿完后还剩\({a_i}'\)颗石子,由于不能不拿,所以\(0\lt {a_i}' \lt a_i\),而且\(a_1\oplus a_2\oplus ... \oplus {a_i}' \oplus ...\oplus a_n = 0\),
    那么\((a_1\oplus a_2\oplus ... \oplus a_i \oplus ...\oplus a_n )\oplus (a_1\oplus a_2\oplus ... \oplus {a_i}' \oplus ...\oplus a_n ) = 0\),
    则\({a_i}' \oplus a_i = 0\),也就是\({a_i}'=a_i\),和\(0\lt {a_i}' \lt a_i\)矛盾

那么如果\(a_1 \oplus a_2 \oplus ... \oplus a_n = x \not= 0\),那么先手总可以从某堆拿走若干颗石子,使得\(a_1\oplus a_2\oplus ...\oplus a_n = 0\),那么最终后手一定没有石子可以拿,则先手必胜
否则,无论先手怎么拿,都会使得\(a_1\oplus a_2\oplus ...\oplus a_n \not= 0\),那么此时后手就变成了先手,所以最初的先手必败

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int k,n,ans,x;
    scanf("%d",&k);
    while (k--)
    {
    	ans=0;
    	scanf("%d",&n);
	    while (n--)
	    {
	        scanf("%d",&x);
	        ans^=x;
	    }
	    if (ans) puts("Yes");
	    else puts("No");
	}
    return 0;
}

标签:...,P2197,nim,题解,石子,先手,lt,ans,oplus
From: https://www.cnblogs.com/guoxiangyu66/p/17028462.html

相关文章

  • Starling常见问题解决办法
    ​​Starling常见问题解决办法​​来自:​​智慧+毅力=无所不能​​ 1、Android设备上阻止用户按下后退后的行为侦听按键事件//阻止后退行为view.stage.addEventL......
  • JSOI2009 题解
    Count二维树状数组板子题,开\(c\)个二维树状数组即可过。可以通过离线对每个权值单独操作做到只开一个二维树状数组。如果空间要求更紧的话可以cdq分治做到只开一个......
  • unity和VS2019联调问题解决
    以前使用VS2015和17的时候联调的时候是可以附加到unity进行联调的,今天用的2019发现不可以了。研究了一下是少装了一个插件。装上插件就解决了。过程如下:当前使用VS版本2019......
  • Unity小地图Minimap制作全面功能介绍篇
    本系列文章将讲述如何制作小地图。功能如下:  小地图的局部放大地图,缩小功能。小地图展开成为大地图,以及与大地图的互相切换  大地图的人物图标跟随角色旋转和移动 ......
  • 洛谷 p5536 题解
    题目链接:https://www.luogu.com.cn/problem/P5536此题为树的dfs的一个应用。思路树dfs时,可以计算每个点的深度。如图所示可以多次dfs,从而找到不同的信息。代码......
  • CF513F2 题解
    题意传送门有\(a+b+1\)个会动的棋子,在一个大小为\(n\timesm\)的棋盘上,棋盘上有一些点有障碍。棋子中,有\(a\)个红色棋子,\(b\)个蓝色棋子,和\(1\)个既能当作红棋......
  • Unity创建Animation动画无法播放问题
    前提:我是要使用animation的方式去播放动画,而不是animator状态机;是针对unity自己制作的动画,而不是外部导入进来的动画。 发现一个问题,我在unity中给一个cube创建一个animat......
  • Unity3D之sprite动画(Animation)的制作
    实例说明:忍者跑酷的player动画制作。。。这些都是用Sprite做的动画。。。在prioject面板里的一组sprite里面点击,之后看属性面板的SpriteEditor对这组Sprite进行编辑。。。......
  • Codeforces Round #839 (Div. 3)题解
    C.DifferentDifferences(贪心)题意​ 给定\(k\),\(n\)\((2\lek\len\le40)\)。从\([1-n]\)中不重复地任选\(k\)个数组成一个数组,使这个数组的差分数组中不同的......
  • 【题解】CF700E Cool Slogans
    原题面很简洁,懒得概括了。思路后缀自动机+结论。这种题出题人没有十年脑血栓都没法出。结论1:\(s_{i-1}\)必定是\(s_i\)的后缀。考虑\(s_i\)中\(s_{i-1......