简单博弈(Bash、Nim)

Bash Game

显然,对于问题有必败态 n=m+1n = m + 1

n=r(m+1)+sn = r \cdot (m + 1) + s,其中 rr 为任意自然数,sms \leq m

  1. 考虑 s0s \neq 0 的情况:
  • r=0r = 0,先手可以直接取完,先手必胜。
  • r0r \neq 0,对于先手总能构造局势 n=r(m+1)n = r \cdot (m + 1) 的局势给后手,直至 r=0r = 0,先手必胜。
  1. s=0s = 0,两者角色互换,后手总能构造必败局面给先手,先手必败。

结论:如果 (m+1)  n(m + 1) \ |\ n,则先手必败,否则先手必胜。

Nim Game

小红与小明在玩游戏,一共有 nn 堆物品,每堆中有 aia_i 数量的物品。

每次从某一堆中取物品,至多将这全部拿走,不能不拿,拿到最后一个物品的玩家获胜。

  1. 定义一个 nn 元组 (a1,a2,,ana_1, a_2, \dots, a_n), 来描述游戏的一个局势。
  • 任意改变 nn 元组中元素的顺序,仍然代表同一个局势。
  • 如果初始局面只有一堆,则先手必胜。
  • 如果初始局势有两堆,且两堆数量相同,后手必胜。(对称性)
  1. 定义局势加法:(a1,a2,,ana_1, a_2, \cdots, a_n) + (b1,b2,,bmb_1, b_2, \cdots, b_m) = (a1,,an,b1,,bna_1, \cdots, a_n, b_1, \cdots, b_n)。

​ eg. (3) + (3) + (1) = (3, 3) + (1) = (3, 3, 1)

  1. 对于局势A,B,SA, B, S, 若 S=A+BS = A + B, 称 SS 可以分解为“子局势” AABB(对称性)
  2. 对于局势A,如果先手有必胜策略,称“S胜”;如果后手有必胜策略,称“S负”。
  • 如果局面为 SS 胜,那么存在一种策略 S>TS -> TTT 负。
  • 如果局面为 SS 负,那么对于任意一种策略 S>TS -> TTT 胜。
  1. 给定一个局势 SS,可以分解成两个子局势 AABB
  • AABB 为一胜一负,则 SS 胜。
  • AABB 负,则 SS 负。
  • AABB 胜,则有时 SS 胜,有时 SS 负。
  1. 二进制不进位加法(异或\oplus)与局势加法对比

​ 令 A,BA, B 代表局势,小写字母 a,ba, b 表示二进制数,那么:

  • AABB 相同,则 A+BA + B 负;若 a0a \neq 0b=0b = 0,则 ab0a \oplus b \neq 0
  • AABB 负,则 A+BA + B 胜;若 a0a \neq 0b=0b = 0,则 ab0a \oplus b \neq 0
  • BBAA 负,则 A+BA + B 胜;若 a0a \neq 0a=0a = 0,则 ab0a \oplus b \neq 0
  • AABB 负,则 A+BA + B 负;若 a=0a = 0b=0b = 0,则 ab=0a \oplus b = 0

猜想:令 f(S)f(S) 表示 SS 局势的异或和,即 a1a2ana_1 \oplus a_2 \cdots \oplus a_n。

  • f(S)0f(S) \neq 0,先手必胜。
  • f(S)=0f(S) = 0,后手必胜。

推导过程:

结论1. a1a2an=p0a_1 \oplus a_2 \cdots \oplus a_n = p \neq 0,那么 k[1,n],akp<pk\exist k \in [1, n], a_k \oplus p < p_k。

证明:

  • p0p\because p \neq 0 \therefore p 二进制最高位为1;
  • 设其最高位为第 qq 位;
  • 那么至少存在一个 kk,使得 aka_k 的第 qq 位也是1;
  • akpa_k \oplus p 的第 qq 位为0,所以 akp<aka_k \oplus p < a_k .

结论2. 若 f(S)=0f(S) = 0,无论先手如果操作,都有 STS \to T 满足 f(T)0f(T) \neq 0。

证明:

  • 不妨设先手在第一堆取了 xx 个,那么对于局势 T=(a1x,a2,,an)T = (a_1 - x, a_2, \cdots, a_n)
  • 由于 f(S)=a1a2an=0f(S) = a_1 \oplus a_2 \cdots \oplus a_n = 0, 所以 a1=(a2a3an)a_1 = (a_2 \oplus a_3 \cdots \oplus a_n) 。
  • f(T)=(a1x)(a1)f(T) = (a_1 - x) \oplus (a_1),而 a1xa1a_1 - x \neq a_1,所以 f(T)0f(T) \neq 0

结论3. 若f(S)0f(S) \neq 0,必然存在一种操作方式 STS \to T满足 f(T)=0f(T) = 0

证明:

  • p=f(S)=a1a2an0p = f(S) = a_1 \oplus a_2 \cdots \oplus a_n \neq 0
  • p0p \neq 0,那么存在 kk,使得 akp<aka_k \oplus p < a_k,不放设 k=1k = 1,即 a1p=x<a1a_1 \oplus p = x < a_1。
  • 如果先行者将第一堆数量变为 xx,那么局势 T=(x,a2,an)T = (x, a_2, \cdots a_n)
  • 由于 p=a1(a2an)p = a_1 \oplus (a_2 \cdots a_n),所以 a2a3an=pa1a_2 \oplus a_3 \cdots \oplus a_n = p \oplus a_1
  • 所以 f(T)=x(pa1)=0f(T) = x \oplus (p \oplus a_1) = 0
课余学习(*^▽^*) 文章被收录于专栏

记录自己课余的学习~

全部评论

相关推荐

程序员小白条:你这技术栈写这么多?结果项目是个黑马点评,别人一看就大概了解你到底是个啥水平了》。。。
点赞 评论 收藏
分享
04-20 22:20
已编辑
门头沟学院 算法工程师
27届,bg为四非本211硕,如题,导师不放实习,且每周至少一次线下组会(工作日),从研一上开始实习,然后我组在研一下引入了打卡机五段大厂分别是:美团到店、美团服务零售、快手电商、字节TikTok、字节CapCut。目前要结束我的第五段实习了(不会再刷第六段,好好搞学校的事,还有秋招)本来一直告诉自己的是“所有委屈到了终点再说”,过去告诉自己的终点自然还没到,但我觉得自己仿佛已经到了另一个终点,有感而发,写了这篇文章也许你会觉得为啥不尝试问问导师能不能实习,或者用其他让自己舒服的手段,我只能说,这很复杂,有导师的人自然会懂,这种一开始就把“利益冲突”摆明面上的招几乎就是不可能成功———————————————————我到底是怎么实习的?骗hr自己满勤,然后没有捷径,就是每周往返,第一段去的是北京美团,而学校在江苏,因此需要一周一次北京江苏往返,因为实习钱少,所以坐的基本是绿皮,难以入睡,下车后就是长达2小时的地铁去公司,地铁站上靠着人睡觉周末做什么?基本在做导师的科研or横向,学习的话很多时候就是尽力在晚上回到出租屋的时候学,这很难维持,但只能不断push自己如何破解打卡机?直接把打卡机偷了,或者使用指纹膜(当然我很早就做好了无法破解的准备,那就是找个长三角实习,每天早起去打卡完坐高铁去实习,从每周高铁往返变成每天)导师会压力吗?非常压力,实习的时候非常害怕微信弹出他的消息,PTSD了,有时候一周要往返两次学校,每次都跟要死了一样,之前真是情绪崩溃好几次,哈哈哈哈平时往返怎么平衡工作?我本来很晕车,为了不耽误公司和导师的进度,从车上一看电脑就头晕、吐,到后面可以随意在高铁、地铁、出租车上Coding,甚至不会再因为往返感到心累了,哈哈哈哈这一路已经淬炼出比较坚强的内心了,已经数不清多少次坐末班高铁从学校回公司,多少次凌晨6点爬起来赶车过去我会把这些当作是我人生的弯路,但现在,这些已经成为我宝贵的经验了。往后,我想我也能真正允许各种不好的情况出现了,因为我会真正把它当作我要解决的问题,而非抱怨,这又何尝不是终点呢?要照顾好身体,我不管怎么往返,一直非常在乎身体,会让自己睡够8小时,最近几星期培养早睡早起到公司健身后去工作的习惯,我觉得好身体很关键
gtgt..:很佩服,但是很恐怖,感觉已经从人类异化到高度运转的机器了
美团成长空间 2787人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务