Nim游戏

题目

N 堆石子,两人轮流从其中一堆取至少一个石子,问先手是否存在必胜策略。

结论

异或不为0,先手必胜。

证明

k 为某一堆取完后的剩余个数,i 为被取那堆石子的编号,则取完后的异或和为 x1xorx2xorxorxi1xorxi+1xorxorxnxork

情况一:异或和为0

  1. 总数为0,此时先手输了
  2. 总数不为0,此时先手还要使异或和为0,就必须使得 k=xi,然而由于至少取一个,所以这是不可能的,所以必然会转为情况二。

情况二:异或和不为0

可以证明,必然可以取为0。

S=x1xorx2xorxorxnxix 中的最大值。

  1. S 的二进制位数小于 xi 的位数,则 xi 必然可以凑出一个数使得其异或 S 等于0。
  2. S 的二进制位数和 xi 的二进制位数相同,需满足 kxiSxorxixork=0。由于 Sxorxi 时已经使得二进制最高位为0,所以 k 的二进制最高位必然为0。k 在二进制的最高位已经满足小于 xi,后面的位数可以随便取,那么只需要取 Sxorxi 即可(这个数的二进制最高位也为0)。

代码

#include<bits/stdc++.h>
using namespace std; 
int n, m, i, j, k, T; 

int main()
{
	scanf("%d", &n); 
	for(i=1; i<=n; ++i) scanf("%d", &k), m^=k; 
	printf(m ? "win" : "lose"); 
	return 0; 
}
posted @   zhangtingxi  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示