---恢复内容开始---

听说有一个东西叫SG函数

觉得自己好像原来是懂一些粗浅的应用但现在感觉要再深♂入一点呢

让我们先来介绍一下SG函数吧

这是某类满足下列条件的玄学博弈问题解法

  • 双人、回合制;
  • 信息完全公开(perfect information);
  • 无随机因素(deterministic);
  • 必然在有限步内结束(finite);
  • 没有平局;
  • 双方可采取的行动相同(impartial);
  • 无法行动者判负(normal play);

具体证明可以见https://zhuanlan.zhihu.com/p/20611132?columnSlug=maigo

那么我们现在有一个函数SG[i]表示某种状态的SG函数

且有SG[i] = mex{SG[k] | k->i(k是i的下一级状态)}   SG[i] = SG[a1]^SG[a2]^SG[a3]^...^SG[ak] (a1...ak是组成状态i的子状态)

如果SG[i] == 0 那么 i 是一种必败态,不然是一种必胜态

于是介绍完了

下面上例题

http://www.lydsy.com/JudgeOnline/problem.php?id=1022

 #include<stdio.h>
#include<stdlib.h>
int main()
{
int T,n,i,x,SG,flag;
scanf("%d",&T);
for(;T>;T--)
{
scanf("%d",&n);
SG=flag=;
for(i=;i<=n;i++)
{
scanf("%d",&x);
SG^=x;
if(x!=) flag=;
}
if( (SG==&&flag==) || (SG!=&&flag==) ) printf("John\n");
else printf("Brother\n");
}
return ;
}

BZOJ 1022

这是一道最简单的SG函数题,连SG函数都不用存就可以一路推推推推出终态的SG函数

http://www.lydsy.com/JudgeOnline/problem.php?id=4035

 #include<bits/stdc++.h>
#define N 100010
using namespace std;
int n,T,SG1[N],SG2[N],m; int read(){
int f = ; char ch = getchar();
while (ch > '' || ch < '' ) ch = getchar();
while (ch <= ''&& ch >= '') {
f = f* + ch - '';
ch = getchar();
}
return f;
} int nxt(int x,int y){ return (x==y)?y+:y/(y/(x+)); } void GetSG(){
int now,cnt,a[N]; bool bo[N];
memset(SG1,,sizeof(SG1));
memset(bo,,sizeof(bo));
memset(SG2,,sizeof(SG2));
for (int i=; i<=n; i=nxt(i,n)){
now=cnt=;
for (int j=; j<=i; j=nxt(j,i)){
int x=i/j; int t=(x>m)?SG2[n/x]:SG1[x];
a[++cnt]=now^t; bo[a[cnt]]=;
if ((i/x-i/(x+))&) now^=t;
}
now=; while (bo[now]) now++;
(i <= m) ? SG1[i] = now : SG2[n/i]=now;
for (int j=; j<=cnt; j++) bo[a[j]]=;
}
} int main(){
n = read(); T = read(); m = (int)sqrt(n); GetSG();
while (T--){
int cnt = read(),ans = ,x;
for (int i = ; i <= cnt; i ++){
x = n/read();
ans^=(x>m)?SG2[n/x]:SG1[x];
}
puts((ans)?"Yes":"No");
}
}

BZOJ4035

这题可以对每一个白格子位置搞SG:SG[i]=mex{SG[i*1]^SG[i*2]^...^SG[i*k]},k∈[2,N/i]

但是我们会发现状态太多存不下

所以我们可以再推一推,发现每个SG函数只和n/i有关,所以状态数就变成了N^0.5个,大于N^0.5的状态就存在n/i里就好了

然后对于每一个状态,有很多状态都是冗余的,不需要计算,所以在循环的时候直接写成像这样就好了:

for (int i = ; i <= n; i = n/(n/(i+))) // 记得判 i == n时不要让程序计算n/(n/(i+1))不然会除0

——————————————————————————————————未完待 θ.θ 续——————————————————————————————————

SG函数学(hua)习(shui)记录的更多相关文章

  1. 博弈论 | 详解搞定组合博弈问题的SG函数

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天这篇是算法与数据结构专题的第27篇文章,我们继续深入博弈论问题.今天我们要介绍博弈论当中非常重要的一个定理和函数,通过它我们可以解决许多 ...

  2. 学习笔记--博弈组合-SG函数

    fye学姐的测试唯一的水题.... SG函数是一种游戏图每个节点的评估函数 具体定义为: mex(minimal excludant)是定义在整数集合上的操作.它的自变量是任意整数集合,函数值是不属于 ...

  3. poj 2425 A Chess Game(SG函数)

    A Chess Game Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3551   Accepted: 1440 Desc ...

  4. 从SG函数浅谈解决博弈问题的通法

    基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数. 其实对于博弈游戏如Bash.Nim等基本类型,异或一些比较高级的棋类游戏 ...

  5. 跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)

    跟我一起学extjs5(19--模块记录的拖放删除.拖放复制新增)         网页其中的拖放(drag-drop)是比較有趣的操作,extjs5中非常好的封装了拖放的动作,也有各种类来支持,可是 ...

  6. 博弈问题之SG函数博弈小结

    SG函数: 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Ga ...

  7. SG函数和SG定理【详解】

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  8. hdu 1848 简单SG函数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Problem Description 任何一个大学生对菲波那契数列(Fibonacci num ...

  9. sg函数小结

    sg函数小结 sg函数是处理博弈问题的重要工具. 我们知道sg(x)=mex{sg(j)|x能到达状态j} sg(x)=0时代表后手赢,否则先手赢. 对于一个问题,如果某些子问题是相互独立的,我们就可 ...

  10. 题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)

    前言 比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ 和dummyummy巨佬一起推了快三个小时的规律 最后去问了真正的巨佬__stdcall __stdcall面带微笑的告诉我们,这是 ...

随机推荐

  1. 神奇的框架插件jquery layer

    layer 的这个相册功能是不是很炫酷,是滴,这就是layer,只要添加一个layerjs就行了 //Javascript代码 layer.photos({ photos: '#photosDemo' ...

  2. XJOI1652Matrix67的情书

    Matrix67的情书 恺撒大帝曾经使用过这样一种加密术:对于明文中的每个字母,恺撒大帝会用它后面的第t个字母代替.例如,当t=3时,字母A将变成C,字母B将变成D,--,字母Y将变成A,字母Z将变成 ...

  3. 玩转 SSH(七):使用 dubbo + zookeeper 实现服务模块化

    一.创建 SSMVCAnnoDemo 项目 点击菜单,选择“File -> New Project” 创建新项目.选择使用 archetype 中的 maven-quickstart 模版创建. ...

  4. Android通过AOP实现防止按钮连续点击

    防止连续点击的实现方式有很多种,比如,在所有的onclick里面加上防多次点击的代码,或者定义一个新的OnClickListener,在里面加上防多次点击的代码,然后项目中的所有OnClickList ...

  5. Java基础学习(一)—方法

    一.方法的定义及格式 定义: 方法就是完成特定功能的代码块. 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2){ 函数体; return 返回值; } 范例1: 写一个两个 ...

  6. HTML5基础学习

    分享一下html5的一些基础,小白上路! 一.html5基本结构 <!DOCTYPE html> ↑声明文档类型为HTML5文件. 文档声明,在HTML文档必不可少.且必须放在文档第一行 ...

  7. opencv构建高斯卷积核

    关于高斯核函数可以参见阮一峰老师的日志:高斯模糊的算法 如何使用高斯核进行高斯模糊可以参见我的另一篇日志:opencv构建自定义卷积 Mat Gaussian_kernal(int kernel_si ...

  8. Linux下deb包安装工具(附带安装搜狗输入法)

    环境是在ubuntu14下的 #1.gdebi安装 使用deb安装工具gdebi,这个工具能解决所有依赖问题 sudo apt-get install gdebi #2.搜狗输入法 deb包下载地址: ...

  9. jQuery的工作原理

    jQuery是为了改变javascript的编码方式而设计的. jQuery本身并不是UI组件库或其他的一般AJAX类库. 那么它是如何实现它的声明的呢? 先看一段简短的使用流程: (1).查找(创建 ...

  10. SAP RFC函数远程调试跟踪管理软件

    最近在搞OA系统与sap的接口开发,接口太多老是和.net的开发人员打嘴仗,为了避免不必要的纠结,自己做了一个rfc的调试工具,有些问题调试起来也比较容易了.程序是delphi开发的,为了保证程序可以 ...