NIM博弈
给定 n堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
首先,这个游戏定义最后没有棋子拿的人会输,因此NIM博弈不存在平局,对于先手只有赢和输这两种情况。
定理:NIM博弈先手必败当且仅当A1^A2^A3^......^An=0
如果无论先手怎么操作,操作完之后都是必胜状态,那么对于先手这就是一个必败状态。
如果先手可以保证操作之后变为必败状态,那么对于先手这就是一个必胜状态。
证明:
所有物品都被取完是一个必败局面,此时 A1^A2^A3^......^An=0 。
证明A1^A2^A3^......^An=x对于先手是一个必胜状态,只需要证明先手永远有一种选择,操作完之后导致后手陷入必败状态A1^A2^A3^......^An=0。
至少存在一个Ai在x最高位取1的地方取1,则Ai^x<Ai,我们就将Ai->Ai^x。这样就将 A1^A2^A3^......^An=x状态变成了A1^A2^A3^......^An=0。这就说明了,如果先手面临A1^A2^A3^......^An=x状态,一定存在某种选择将状态转化位A1^A2^A3^......^An=0。
证明A1^A2^A3^......^An=0对于先手是一个必败状态,只需要证明无论先手怎么操作都会导致A1^A2^A3^......^An!=0。
如果先手将A1->a,a=A1^x,这个式子就变成了A1^x^A2^A3^......^An,如果这个式子仍然等于0,A1^x^A2^A3^......^An=0,两边同时异或上A1^A2^A3^......^An,式子就变成了x=A1^A2^A3^......^An=0,说明x=0,a=A1^x=A1,即先手不能取!这样是不合法的!这就说明了,如果先手面临A1^A2^A3^......^An=0这一状态,那么先手操作完之后一定是A1^A2^A3^......^An!=0。
复述一遍结论:NIM博弈先手必败当且仅当A1^A2^A3^......^An=0
一般情形下的必胜策略与两堆的情形基本一致:若物品堆的尼姆和为0,则后手方有必胜策略,否则先手方有必胜策略。必胜策略的构造基于下面的定理:
- 1.
在尼姆和为0时,无论如何拿取物品,拿取之后物品堆的尼姆和一定不为0;
- 2.
在尼姆和不为0时,总存在一种拿取物品的方式,使得拿取之后物品堆的尼姆和为0。
若物品堆的尼姆和为0,则无论先手方如何拿取,操作之后物品堆的尼姆和一定不为0,先手方总是不能将物品拿完。后手方总是可以选择拿取方式使得物品堆的尼姆和再次为0,同时物品的数量严格减小,这样操作下去,有限多轮之后即可使得后手方拿取物品后所有物品均被拿取,即后手方有必胜策略。也就是不断缩小,最终到达状态0^0^0^0=0。
若物品堆的尼姆和不为0,则先手方总可以选择拿取方式使得拿取之后物品堆的尼姆和为0,且处于后手方的位置。由上述讨论可知,先手方有必胜策略。
变体
如果将规则改为拿到最后一个物品者败,可得到尼姆博弈的一种变体。
显而易见的是,如果每堆都是1,偶数堆则先手必胜,奇数堆则后手必胜。谁遇到偶数堆谁赢,谁遇到奇数堆谁输。
如果只有一堆的数量大于1:
1)奇数堆, 先手把唯一>1的那一堆变成1,就可以让后手面对奇数堆1的局面,先手必胜。这种情况下nim和一定是不为0的。
2)偶数堆,先手把唯一>1的那一堆变成0,就可以让后手面对奇数堆1的局面,先手必胜。这种情况下的nim和就是x^1,也是不等于0的。
如果两堆及以上数量大于1:
如果先手想赢最后就要变成只有1堆数量大于1,即nim和不为0。比如2 2 1 3,nim和不为0,先手拿走一个数让nim和变为0,即可。
综上,先手必胜情况如下:
1)nim和为0且每堆只有一个物品
2)nim和不为0,至少有一堆有多个物品
不能必胜则必败,反之,后者必胜。
892. 台阶-Nim游戏 - AcWing题库
现在,有一个 n 级台阶的楼梯,每级台阶上都有若干个石子,其中第 i 级台阶上有 ai 个石子(ai≥1)。
两位玩家轮流操作,每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中(不能不拿)。
已经拿到地面上的石子不能再拿,最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
如果只有一级台阶,显然先手必胜。nim和不为0。
如果有两级台阶,二级台阶上只有一个数,先者必须把它拿下去,先者必败。
如果有两级台阶,二级台阶上至少有2个,先者想要自己最终面对只有一级台阶的结果,也就是这n个里面最后一次是后者拿。那么先者拿n-1个,后者拿1个即可。先者必胜。
如果有三级台阶,三级台阶上只有一个数,后者遇到二阶台阶的情况,先者必败。
如果有三级台阶,三级台阶上有n个数字,先者必胜。
我们好像只要判断,最后一级台阶就可以了。。。。。(推翻了哈哈哈,如果只能从n-1台阶的顺序拿就是这样,但是这题能从任一一级台阶上拿然后放到下一级。)
如果只有一级台阶,显然先手必胜。nim和不为0。
如果有两级台阶,先者必胜,直接把1阶的拿走就赢了。
突然发现只要奇数阶全都拿走就能赢了,因为偶数阶必定要偶数次才能拿走,也就是先者必胜。这就变成了奇数阶的nim游戏。
#include<bits/stdc++.h>
using ll=long long;
const int mod=1e9+7;
const int N=2e5+10;
int a[N];
void solve()
{//对奇数阶异或
int n;
std::cin>>n;
int l=0;
for(int i=1;i<=n;i++)
{
std::cin>>a[i];
if(i%2!=0) l^=a[i];
}
if(l==0) std::cout<<"No"<<'\n';
else std::cout<<"Yes"<<'\n';
}
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t=1;
//std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
公平组合游戏ICG
定义:
1两名玩家交替行动
2在游戏进程的任意时刻,可以执行的合法行动与轮到谁无关
3不能行动的玩家判负
则称这是一个公平组合游戏。(NIM博弈属于公平组合游戏。但常见的棋类游戏不是,如围棋。)
有向图游戏
给定一个有向无环图,图中有唯一一个起点,在起点上有一枚棋子。两名玩家交替地把这枚棋子沿有向边移动,每次可以移动一步,无法移动者判负。该游戏被称为有向图游戏。
任何一个公平组合游戏都能转化成有向图游戏。把每个局面看成图中的一个节点。
Mex运算
设S为一个非负整数集合,定义Mex(S)为求出不属于集合S的最小非负整数。
SG函数
在有向图游戏中,对于每个节点x,设从x出发共有k条有向边,分别到达结点y1,y2,...,yk,定义SG(x)为x的后继节点y1,y2,...,yk的SG函数值构成的集合再执行mex运算的结果,即:
特别的,整个有向图游戏G的SG函数值被定义为有向图游戏起点s的SG函数。SG(G)=SG(s)。