参考自 石家庄二中 贾志豪 IOI2009国家集训队论文 《组合游戏略述—— 浅谈 SG 游戏的若干拓展及变形》

一、定义

游戏规则加上 对于还没有结束的所有单一游戏,游戏者必须对其进行决策

二、结论

对于必胜的单一游戏,游戏者希望玩的越久越好

对于必败的单一游戏,游戏者希望越早结束越好

因为Every-SG 游戏的获胜方取决于坚持到最后的游戏者

所以

对于必胜态,需要知道最慢几步可以结束游戏

对于必败态,需要知道最快几步可以结束游戏

令step表示结束游戏的步数

那么

若状态S是结束状态,那么step(s)=0

若状态S是先手必胜态,那么step(s)=max(step(t))+1,其中满足t是先手必败态

若状态S是先手必败态,那么step(s)=min(step(s))+1

定理:

Every-SG 游戏先手必胜当且仅当单一游戏中最大的step为奇数。

三、证明

要证明结论的正确性,需证明以下三点:

1、若S为先手必胜态,则step(s)=奇数,否则step(s)=偶数

因为Every-SG 游戏的获胜方取决于坚持到最后的游戏者,所以游戏的获胜方取决于最大的step。

2、设最大的step为step_max,那么获胜方要保证游戏 在>=step_max 步结束

3、设最大的step为step_max,那么获胜方要保证所有的必败单一游戏在<=step_max步结束

这两点显然

证明1:数学归纳法,终止状态为先手必败态,step=0=偶数,往前推即可

证明2:

设step最大的单一游戏为A,获胜方为W

W总在A处于先手必胜态时移动A的状态,而它又希望游戏持续时间越长越好,所以只会使A的step减少1

对方总是在A处于先手必败态时移动A的状态,而处于先手必败态时,step是后继状态的step取min+1,所以对方至多使step减少1

这里的减少x指转移到step-x的后继状态

所以 游戏在>=step_max 步内结束

证明3:

设获胜方为W,其某一个必败单一游戏为B

W总是在B处于先手必败态时移动B的状态,所以他希望这个游戏越早结束越好,此时的step是后继状态的step取min+1,所以W一定会使step减少1

对方总是在B处于先手必胜态时移动B的状态,此时step是后继状态的step取max+1,所以对方至少使step减少1

所以游戏B在<=step_max 步结束

四、例题

hdu 3595  GG and MM

题意:

N组石子,每组有两堆,每次可以从一堆中取走另一堆的倍数个石子,N组石子同时操作

#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; #define N 1001 int sg[N][N];
int step[N][N]; int find(int a,int b)
{
if(a>b) swap(a,b);
if(sg[a][b]!=-) return sg[a][b];
int mi=1e9,mx=-;
for(int i=a;i<=b;i+=a)
if(!find(a,b-i))
{
sg[a][b]=sg[b][a]=;
mx=max(mx,step[a][b-i]);
}
else mi=min(mi,step[a][b-i]);
if(sg[a][b]==)
{
step[a][b]=step[b][a]=mx+;
return true;
}
step[a][b]=step[b][a]=mi+;
return sg[a][b]=sg[b][a]=;
} int main()
{
int n,a,b;
int ans;
memset(sg,-,sizeof(sg));
for(int i=;i<N;++i) sg[][i]=sg[i][]=;
while(scanf("%d",&n)!=EOF)
{
ans=;
for(int i=;i<=n;++i)
{
scanf("%d%d",&a,&b);
find(a,b);
ans=max(ans,step[a][b]);
}
puts(ans& ? "MM" : "GG");
}
}

Every-SG游戏的更多相关文章

  1. [BZOJ 1874] [BeiJing2009 WinterCamp] 取石子游戏 【博弈论 | SG函数】

    题目链接:BZOJ - 1874 题目分析 这个是一种组合游戏,是许多单个SG游戏的和. 就是指,总的游戏由许多单个SG游戏组合而成,每个SG游戏(也就是每一堆石子)之间互不干扰,每次从所有的单个游戏 ...

  2. 每一个可以移动的棋子都要移动——Every-SG 游戏

    先看一个问题 HDU 3595 GG and MM (Every_SG博弈) 题目有N个游戏同时进行,每个游戏有两堆石子,每次从个数多的堆中取走数量小的数量的整数倍的石子.取最后一次的获胜.并且N个游 ...

  3. 【BZOJ】【1022】【SHOI2008】小约翰的游戏John

    博弈论 一看题,哇这不是Nim游戏么= =直接异或起来……啊咧怎么不对? 这道题是[Anti-Nim],普通的Nim是取走最后一个就赢,这题是取走最后一个输…… 做法参见 2009年贾志豪论文< ...

  4. BZOJ_1022_[SHOI2008]_小约翰的游戏John_(博弈论_反Nim游戏)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1022 反Nim游戏裸题.详见论文<组合游戏略述——浅谈SG游戏的若干拓展及变形>. ...

  5. poj 3710 Christmas Game(树上的删边游戏)

    Christmas Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1967   Accepted: 613 Des ...

  6. POJ 3710 Christmas Game#经典图SG博弈

    http://poj.org/problem?id=3710 (说实话对于Tarjan算法在搞图论的时候就没搞太懂,以后得找时间深入了解) (以下有关无向图删边游戏的资料来自论文贾志豪<组合游戏 ...

  7. [BZOJ1022] [SHOI2008] 小约翰的游戏John (SJ定理)

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  8. 博弈论进阶之Anti-SG游戏与SJ定理

    前言 在上一节中,我们初步了解了一下SG函数与SG定理. 今天我们来分析一下SG游戏的变式--Anti-SG游戏以及它所对应的SG定理 首先从最基本的Anti-Nim游戏开始 Anti-Nim游戏是这 ...

  9. 简单易懂的博弈论讲解(巴什博弈、尼姆博弈、威佐夫博弈、斐波那契博弈、SG定理)

    博弈论入门: 巴什博弈: 两个顶尖聪明的人在玩游戏,有一堆$n$个石子,每次每个人能取$[1,m]$个石子,不能拿的人输,请问先手与后手谁必败? 我们分类讨论一下这个问题: 当$n\le m$时,这时 ...

随机推荐

  1. node多文件处理方法

    let events = require('events'); let fs = require('fs'); // 将readfile封装成一个方法 多文件处理  function fnreadFi ...

  2. 通过Oracle DUMP 文件获取表的创建语句

    1. 有了dump文件之后 想获取表的创建语句. 之前一直不知道 dump文件能够直接解析文件. 今天学习了下 需要的材料. dump文件, dump文件对应的schema和用户. 以及一个版本合适的 ...

  3. [CNBETA]Intel CPU底层漏洞事件完全详解:全球手机/电脑无一幸免[转帖]

    http://www.cnbeta.com/articles/tech/685897.htm 由Intel CPU漏洞问题衍生出来的安全事件已经波及全球几乎所有的手机.电脑.云计算产品,ARM确认 C ...

  4. Fiddler4入门——手机抓包

    一.下载工具包 百度搜索”fiddler 下载“ ,安装最新版本 下载的软件安装包为“fiddler_4.6.20171.26113_setup.exe”格式,双击安装.安装成功,在“开始”-“所有程 ...

  5. BZOJ4870 [六省联考2017] 组合数问题 【快速幂】

    题目分析: 构造f[nk][r]表示题目中要求的东西.容易发现递推公式f[nk][r]=f[nk-1][r]+f[nk-1][(r-1)%k].矩阵快速幂可以优化,时间复杂度O(k^3logn). 代 ...

  6. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 i题 Minimum(线段树)

    描述 You are given a list of integers a0, a1, …, a2^k-1. You need to support two types of queries: 1. ...

  7. 自学Python5.3-类和对象的简单操作

    自学Python之路 自学Python5.3-类和对象的简单操作 1. 定义一个类 定义一个类的格式如下: class 类名: 方法列表 举例1 : class Cat: #定义一个Cat类 #属性 ...

  8. 【BZOJ3202】项链(莫比乌斯反演,Burnside引理)

    [BZOJ3202]项链(莫比乌斯反演,Burnside引理) 题面 BZOJ 洛谷 题解 首先读完题目,很明显的感觉就是,分成了两个部分计算. 首先计算本质不同的珠子个数,再计算本质不同的项链个数. ...

  9. 安装Helm

    一:1.下载helm-v2.10.0-linux-amd64.tar.gz 地址:https://github.com/kubernetes/helm/releases2,解压缩 tar -zxvf ...

  10. bzoj1494 生成树计数 (dp+矩阵快速幂)

    题面欺诈系列... 因为一个点最多只能连到前k个点,所以只有当前的连续k个点的连通情况是对接下来的求解有用的 那么就可以计算k个点的所有连通情况,dfs以下发现k=5的时候有52种. 我们把它们用类似 ...