(博弈论) P2197 【模板】Nim 游戏

news/2025/3/26 16:25:14/文章来源:https://www.cnblogs.com/wjx-/p/18789992

洛谷 P2197 【模板】Nim 游戏

(这是一道代码实现十分简单的题目,就不废话,直接干吧!)

知识铺垫:

1. Nim 游戏基本概念

Nim 游戏是一种经典的组合博弈游戏。在 Nim 游戏中,有若干堆物品,两名玩家轮流操作,每次可以从任意一堆中取走任意数量的物品(不能不取),最后没有物品可取的玩家输掉游戏。

2. 异或运算异或运算

异或运算异或运算(用符号 表示)是一种二进制位运算。对于两个二进制数,相同位上数字相同则结果为 \(0\),不同则结果为 \(1\)。例如:

  • 的二进制表示为 , 的二进制表示为 ,则 (二进制),转化为十进制是 。
    异或运算具有以下性质:
  • 交换律:\(a \oplus b=b \oplus a\)
  • 结合律:\((a \oplus b) \oplus c=a \oplus (b \oplus c)\)
  • 对于任意整数 \(a, a \oplus a=0\)
  • 对于任意整数 ,\(a,a \oplus 0=a\)

3. Nim 和

在 Nim 游戏中,Nim 和是一个关键概念。对于\(n\)堆石子,每堆石子的数量分别为\(a_1,a_2,a_3…a_{n-1},a_n\),它们的 Nim 和定义为 \(S=a_1 \oplus a_2 \oplus a_3… \oplus a_{n-1} \oplus a_n\)

解答思路

1.必胜策略与 Nim 和的关系
Nim 游戏有一个重要的结论:当且仅当 Nim 和 \(S \ne 0\) 时,先手有必胜策略;当\(S=0\)时,先手必败。
证明思路:

  • 终态:当所有堆的石子数都为 0 时,Nim 和 \(S=0\),此时轮到的玩家没有石子可取,输掉游戏。
  • 状态转移:

若当前状态的 Nim 和 \(S \ne 0\),设\(S\)的二进制表示中最高位的 1 在第 \(k\)位。那么必然存在至少一堆石子,其数量的二进制表示中第\(k\)位也是 1(因为异或运算中只有对应位上有奇数个 1 结果才为 1)。设这堆石子数量为\(a_i\) ,我们可以从这堆石子中取走一些石子,使得剩下的石子数量为\(a_i{'}=a_i \oplus S\)。这样操作后,新的 Nim 和\(S'=(a_1 \oplus … \oplus a_i{'} \oplus a_i+1 \oplus …a_n)=S'=(a_1 \oplus … \oplus a_i\oplus S \oplus a_i+1 \oplus …a_n)=S \oplus S=0\)

若当前状态的 Nim 和\(S=0\),无论从哪一堆取走多少石子,都会使得新的 Nim 和 \(S' \ne 0\)。因为从某一堆\(a_j\)取走一些石子后,\(a_j\)变为\(a_j{'}\),且\(a_j \ne a_j{'}\) ,那么新的 Nim 和 \(S'=S \oplus a_j \oplus a_j{'}=0 \oplus a_j \oplus a_j{'}=a_j \oplus a_j{'} \ne 0\)

代码实现:

码风可能不如人意,请见谅。
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
using namespace std;
int t,n;
int sum=0;
int main(){ios::sync_with_stdio(0);//cin 与 cout 的的加速语句cin.tie(0),cout.tie(0);cin>>t;for(int x=1;x<=t;x++){int y;sum=0;cin>>n;for(int i=1;i<=n;i++) {cin>>y;sum^=y;//逐堆异或计算总和}cout<<(sum?"Yes\n":"No\n");/*orif(sum){cout<<"Yes\n";}else{cout<<"No\n";}*/}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/904917.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内首个HR智能体平台:开启人力资源管理智能化征程

在当今数字化飞速发展的浪潮中,人工智能已不再是一个遥远的概念,而是实实在在地渗透到了各个领域,深刻改变着我们的工作与生活方式。人力资源管理,这一关乎企业核心竞争力的关键环节,也正经历着AI技术带来的前所未有的变革。HR智能体作为这一变革中的重要成果,正逐渐成为…

爆火开源库!20K星标,一键让网页设计秒变手绘风

今天必须给大伙说说一个超有意思的开源库,在GitHub上已经斩获20K星标啦,它能轻松给网页设计加上手绘风格的“滤镜”,让页面瞬间告别千篇一律,充满艺术感!一、Rough.js是什么?这个名为Rough.js轻量级的图形库,大小才8KB,能赋予网页元素自然又独特的手绘质感。通过一套特…

易路iBuilder智能体平台:AI+HR、全场景、深融合,7大创新应用引领HR管理变革

从国产AI大模型DeepSeek发布至今,国内外人工智能的热度持续居高不下。AI Agent(智能体)作为人工智能领域的重要概念与产品形态,也被广泛提起、认识并应用于千行万业中。本文将基于人力资源领域首个AI Agent垂直应用——易路iBuilder智能体平台的创新实践应用,对智能体在人…

Gitee DevOps 实践指南:本土团队效率提升的新范式

在数字化转型的浪潮中,Gitee DevOps 作为国内领先的一体化研发效能平台,通过深度融合代码托管、CI/CD、项目管理等核心功能,为企业提供了本土化的 DevOps 解决方案。一、Gitee DevOps 的核心价值定位 在数字化转型的浪潮中,Gitee DevOps 作为国内领先的一体化研发效能平台,…

那些正常的动态规划

目录前言动态规划到底是啥?线性dp最长上升子序列子集和子序列和子串的区别内容分析最大上升子序列例题1——[NOIP2004 提高组] 合唱队形分析最长公共子序列最长公共子串平面dp例题2——[NOIP2000 提高组] 方格取数分析例题3——[NOIP2008 提高组] 传纸条分析例题4——最大加权…

3月24日刷题笔记-第六章 流量特征分析-常见攻击事件 tomcat

1、在web服务器上发现的可疑活动,流量分析会显示很多请求,这表明存在恶意的扫描行为,通过分析扫描的行为后提交攻击者IP flag格式:flag{ip},如:flag 我们查看流量包,可以发现有一个外部IP在对常见端口进行SYN扫描,判断出为恶意IPflag{14.0.0.120} 2、找到攻击者IP后请通过…

如何在云效中使用 DeepSeek 等大模型实现 AI 智能评审

除了代码智能补全外,AI 代码智能评审是 DevOps 领域受开发者广泛关注的另一场景了。本文,我们将结合云效代码管理 Codeup、流水线 Flow 和 DeepSeek,分享一种企业可快速自主接入,即可实现的 AI 智能评审解决方案,希望给大家一些启发。作者:崔力强、黄博文 除了代码智能补…

T+0量化:JAVA接入Level2高频行情(附Python代码)

去年在知乎分享过一个网格策略,评论区全是"代码能跑通但实盘不敢用"的留言。当时我也一样——用第三方平台回测美滋滋,一到实盘就怂:行情延迟3秒、API调用次数受限、策略逻辑被平台规则卡脖子…直到把整套系统搬回本地,才发现自建交易系统的快感就像从合租屋搬进…

制作一个简单的带有3D打印部件的四足蜘蛛机器人

在这个项目中,我将向您展示如何使用3D打印部件制作一个简单的4腿行走蜘蛛机器人。该设计主要由上下板、臂接插件、腿和伺服支架五个部分组成。机器人的4条腿由4个手臂部分和4个腿部分组成。机器人的运动总共使用了8个业余伺服电机,4个在手臂上,4个在腿上。在电路方面,首选E…

统计学习之数据挖掘(结构数据)

统计学习之数据挖掘(结构数据):降维聚类关联度分析分类神经网络