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面带微笑的告诉我们,这是 ...
随机推荐
- 老李秘技:loadrunner回放脚本错误提示Error: "HTTP Status-Code 500"
老李秘技:loadrunner回放脚本错误提示Error: "HTTP Status-Code 500" 当脚本回放的时候出现错误提示Error: "HTTP Sta ...
- C#, VB.NET如何加密PDF文档
在日常工作中,人们通常通过加密PDF文档的方式来保护PDF文档.不管是公司还是个人,使用PDF加密术来设置一些权限是必不可少的.为了使PDF文档既可读又不能被未授权的用户所更改,一份PDF文档往往需要 ...
- Windows下Nginx的安装与使用(一):配置端口转发
什么是端口转发 当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了 8001 端口,电影应用启动了 8002 端口.此时如果我们可以通过: localhost:8001 //图书 lo ...
- 3.Maven坐标和依赖
1.1 何为Maven坐标 正如之前所说的,Maven的一大功能就是管理项目依赖.为了能自动化地解析任何一个Java构件,Maven就必须将它们唯一标识,这就依赖管理的底层基础——坐标. 1.2 坐标 ...
- 自行扩展 FineUIMvc 通知对话框(多个并排显示不重叠,支持最新的显示在最上方)
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 这篇文章我们将改造 FineUIMvc 默认的通知对话框,使得同时显示多个也不会重叠.并提前出一个公共的JS文件,供大家使用. ...
- 什么是RESTful?
RESTful一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. REST ...
- [Oracle]审计Audit
1.Audit的概念 Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析.利用Audit功能,可以完成以下任务: 监视和收集特定数据库活动的数据.例如管理员能够审计哪些表被更新,在某 ...
- UEditor编辑器和php简单的实现socket通信
一.UEditor编辑器 使用这个编辑器是需要先下载编辑器文件,记得下载的时候放入自己的网站中,既然是php中使用,自然我下载的就是php的UEditor编辑器了,然后是utf-8的 其实使用很简单, ...
- tablelayoutpanel内部组件变形
tablelayoutpanel设为dock=full后,最大化或最小化窗口会变形. 解决办法:加入flowlayoutpanel,将tablelayoutpanel放入其中,然后在tablelayo ...
- 【Java 并发】详解 ThreadPoolExecutor
前言 线程池是并发中一项常用的优化方法,通过对线程复用,减少线程的创建,降低资源消耗,提高程序响应速度.在 Java 中我们一般通过 Exectuors 提供的工厂方法来创建线程池,但是线程池的最终实 ...