SG函数学(hua)习(shui)记录
---恢复内容开始---
听说有一个东西叫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)记录的更多相关文章
- 博弈论 | 详解搞定组合博弈问题的SG函数
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天这篇是算法与数据结构专题的第27篇文章,我们继续深入博弈论问题.今天我们要介绍博弈论当中非常重要的一个定理和函数,通过它我们可以解决许多 ...
- 学习笔记--博弈组合-SG函数
fye学姐的测试唯一的水题.... SG函数是一种游戏图每个节点的评估函数 具体定义为: mex(minimal excludant)是定义在整数集合上的操作.它的自变量是任意整数集合,函数值是不属于 ...
- poj 2425 A Chess Game(SG函数)
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3551 Accepted: 1440 Desc ...
- 从SG函数浅谈解决博弈问题的通法
基于笔者之前对于几种二元零和博弈游戏的介绍,这里将其思想进行简单的提炼,并引出解决这类二元零和博弈游戏的强大工具——SG函数. 其实对于博弈游戏如Bash.Nim等基本类型,异或一些比较高级的棋类游戏 ...
- 跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)
跟我一起学extjs5(19--模块记录的拖放删除.拖放复制新增) 网页其中的拖放(drag-drop)是比較有趣的操作,extjs5中非常好的封装了拖放的动作,也有各种类来支持,可是 ...
- 博弈问题之SG函数博弈小结
SG函数: 给定一个有向无环图和一个起始顶点上的一枚棋子,两名选手交替的将这枚棋子沿有向边进行移动,无法移 动者判负.事实上,这个游戏可以认为是所有Impartial Combinatorial Ga ...
- SG函数和SG定理【详解】
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点 ...
- hdu 1848 简单SG函数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 Problem Description 任何一个大学生对菲波那契数列(Fibonacci num ...
- sg函数小结
sg函数小结 sg函数是处理博弈问题的重要工具. 我们知道sg(x)=mex{sg(j)|x能到达状态j} sg(x)=0时代表后手赢,否则先手赢. 对于一个问题,如果某些子问题是相互独立的,我们就可 ...
- 题解——牛客网Wannafly挑战赛23 B-游戏 (SG函数)
前言 比赛的时候没学过SG函数的蒟蒻以为是道结论题,但是不是QwQ 和dummyummy巨佬一起推了快三个小时的规律 最后去问了真正的巨佬__stdcall __stdcall面带微笑的告诉我们,这是 ...
随机推荐
- 神奇的框架插件jquery layer
layer 的这个相册功能是不是很炫酷,是滴,这就是layer,只要添加一个layerjs就行了 //Javascript代码 layer.photos({ photos: '#photosDemo' ...
- XJOI1652Matrix67的情书
Matrix67的情书 恺撒大帝曾经使用过这样一种加密术:对于明文中的每个字母,恺撒大帝会用它后面的第t个字母代替.例如,当t=3时,字母A将变成C,字母B将变成D,--,字母Y将变成A,字母Z将变成 ...
- 玩转 SSH(七):使用 dubbo + zookeeper 实现服务模块化
一.创建 SSMVCAnnoDemo 项目 点击菜单,选择“File -> New Project” 创建新项目.选择使用 archetype 中的 maven-quickstart 模版创建. ...
- Android通过AOP实现防止按钮连续点击
防止连续点击的实现方式有很多种,比如,在所有的onclick里面加上防多次点击的代码,或者定义一个新的OnClickListener,在里面加上防多次点击的代码,然后项目中的所有OnClickList ...
- Java基础学习(一)—方法
一.方法的定义及格式 定义: 方法就是完成特定功能的代码块. 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2){ 函数体; return 返回值; } 范例1: 写一个两个 ...
- HTML5基础学习
分享一下html5的一些基础,小白上路! 一.html5基本结构 <!DOCTYPE html> ↑声明文档类型为HTML5文件. 文档声明,在HTML文档必不可少.且必须放在文档第一行 ...
- opencv构建高斯卷积核
关于高斯核函数可以参见阮一峰老师的日志:高斯模糊的算法 如何使用高斯核进行高斯模糊可以参见我的另一篇日志:opencv构建自定义卷积 Mat Gaussian_kernal(int kernel_si ...
- Linux下deb包安装工具(附带安装搜狗输入法)
环境是在ubuntu14下的 #1.gdebi安装 使用deb安装工具gdebi,这个工具能解决所有依赖问题 sudo apt-get install gdebi #2.搜狗输入法 deb包下载地址: ...
- jQuery的工作原理
jQuery是为了改变javascript的编码方式而设计的. jQuery本身并不是UI组件库或其他的一般AJAX类库. 那么它是如何实现它的声明的呢? 先看一段简短的使用流程: (1).查找(创建 ...
- SAP RFC函数远程调试跟踪管理软件
最近在搞OA系统与sap的接口开发,接口太多老是和.net的开发人员打嘴仗,为了避免不必要的纠结,自己做了一个rfc的调试工具,有些问题调试起来也比较容易了.程序是delphi开发的,为了保证程序可以 ...