【算法竞赛进阶指南】 0x3A 博弈论之SG函数

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. 1.

    在尼姆和为0时,无论如何拿取物品,拿取之后物品堆的尼姆和一定不为0

  2. 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)。

 

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值