【洛谷P2197】【模板】nim游戏【博弈论】

博客围绕Nim取石子游戏展开,介绍甲、乙两人玩该游戏的规则,即地上有n堆石子,每人每次从任意一堆取任意多枚,最后没石子可取者输。给出先手必胜策略的定理:NIM博弈中先手必胜当且仅当a1 xor a2 xor... xor an>0,并给出粗略证明,还提及题目链接。

题目大意:

题目链接:https://www.luogu.org/problemnew/show/P2197
甲,乙两个人玩Nim取石子游戏。
nim游戏的规则是这样的:地上有n堆石子,每人每次可从任意一堆石子里取出任意多枚石子扔掉,可以取完,不能不取。每次只能从一堆里取。最后没石子可取的人就输了。假如甲是先手,且告诉你这n堆石子的数量,他想知道是否存在先手必胜的策略。


思路:

N I M NIM NIM博弈的模板。
定理: N I M NIM NIM博弈中先手必胜,当且仅当 a 1   x o r   a 2   x o r   a 3   x o r . . . x o r   a n > 0 a_1\ xor\ a_2\ xor\ a_3\ xor...xor\ a_n>0 a1 xor a2 xor a3 xor...xor an>0

N = a 1   x o r   a 2   x o r   a 3   x o r . . . x o r   a n N=a_1\ xor\ a_2\ xor\ a_3\ xor...xor\ a_n N=a1 xor a2 xor a3 xor...xor an
因为 a x ≥ 0 a_x\geq0 ax0,所以显然 N ≥ 0 N\geq0 N0
首先,当所有石子全部被取完时,显然有 N = 0 N=0 N=0。此时先手处于必败态
如果 N &gt; 0 N&gt;0 N>0,那么设 N N N二进制下从左往右数第一位为1的是第 k k k位,那么必然有奇数堆石子的第 k k k位为1,设第 i i i堆石子的第 k k k位为1,那么就从 i i i中取出若干石子,使得 a i a_i ai变为 a i   x o r   N a_i\ xor\ N ai xor N(显然 a i   x o r   N &lt; a i a_i\ xor\ N&lt;a_i ai xor N<ai)。由于数量为奇数,那么取完的必然是先手,此时有 N = 0 N=0 N=0
通过数学归纳法可得, N = 0 N=0 N=0时先手为必败态, N &gt; 0 N&gt;0 N>0时先手为必胜态。

证明过程很粗略而不严谨,大概是这个意思好了 : ) :) :)


代码:

#include <cstdio>
using namespace std;

int T,n,ans,x;

int main()
{
	scanf("%d",&T);
	while (T--)
	{
		scanf("%d",&n);
		ans=0;
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&x);
			ans^=x;
		}
		if (!ans) printf("No\n");
			else printf("Yes\n");
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值