hdoj 1729 Stone Games(SG函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1729
看了题目感觉像Nim,但是有范围限制,有点不知道SG函数该怎么写
看了题解,最后才明白该怎么去理解 。
首先进行对s和c进行分类,
1、c = 0 的时候,无论怎样都填不满,直接跳过;
2、c = s 的时候,先手必败,即是P态;
3、c < s 的时候,可以分为两种情况:
1)c^2 + c < s 的时候,递归
2)c^2 + c > s 的时候,先手必胜,即N态
int mex(int s, int c){
|| s == c)
;
int q = sqrt(s);
while( q+q*q >= s)
q--;//最大的不能一次填满的数
if(c > q) return s-c;
else return mex(q,c);
}
主要的理解难点就是 mex(s,c)和mex(k,c)为什么是等价的,个人是这么理解的,
当跑到第一个q+q*q<s的时候,如果c>q,那么可以一次填满,
但如果c<q,不可能一次填满,此时可以分割成两个事件,mex(c,k)和mex(s,k),
其中对于mex(s,k),mex(s,s) 是先手必败,即P态,mex(s,k+1)...mex(s,s-1)都是先手必胜,即N态,
所有移动都导致N态局面的是P态,所以显然mex(s,k)是P态,那么mex(s,k)显然与mex(k,c)等价
#include<stdio.h>
#include<cmath>
#include<cstring>
using namespace std;
;
int mex(int s, int c){
|| s == c)
;
int q = sqrt(s);
while( q+q*q >= s)
q--;//最大的不能一次填满的数
if(c > q) return s-c;
else return mex(q,c);
}
int main(){
int N;
int ans;
int s, c;
;
while(~scanf("%d",&N)&&N){
ans = ;
; i < N; ++i){
scanf("%d%d",&s,&c);
ans = ans^mex(s,c);
}
printf("Case %d:\n",++T);
if(ans)
puts("Yes");
else
puts("No");
}
}
hdoj 1729 Stone Games(SG函数)的更多相关文章
- Light OJ 1296 - Again Stone Game (博弈sg函数递推)
F - Again Stone Game Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- UVA 11927 - Games Are Important(sg函数)
UVA 11927 - Games Are Important option=com_onlinejudge&Itemid=8&page=show_problem&catego ...
- LightOJ 1296 Again Stone Game(sg函数)题解
题意:每次必须拿且只能拿不超过一半的石头,不能拿为败 思路:显然算出每个的sg函数,但是范围1e9显然不能直接打表.所以先打表找规律,发现偶数一直是自己的一半,奇数好像没规律.偶数x的sg函数值是x/ ...
- HDOJ 1848(SG函数)
对于SG函数来说,sg[y]=x的意义为,x与y的输赢状态是相同的 sg[y]=mex(y)的定义与n.p点的定义是相同的 #include<iostream>#include<cs ...
- hdu 1729 Stone Game
Stone Game HDU - 1729 题意: 给定n个箱子,每个箱子的容量为si,每个箱子里最初有ci个石子,每次放入石子不能超过放入前的石子数的平方,谁无法继续放入石子就算输. /* 这是 ...
- 新年第一发--HDU1848--Fibonacci again and again(SG函数)
Problem Description 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:F(1)=1;F(2)=2;F(n)=F(n-1)+F(n-2 ...
- 【转】博弈—SG函数
转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...
- hdu1536&&hdu3023 SG函数模板及其运用
S-Nim Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status ...
- HDU1848 Fibonacci again and again SG函数
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
随机推荐
- Npoi Web 项目中(XSSFWorkbook) 导出出现无法访问已关闭的流的解决方法
原本在CS项目中用的好好的在BS项目中既然提示我导出出现无法访问已关闭的流的解决方法 比较郁闷经过研究 终于解决了先将方法发出来 让遇到此问题的筒子们以作参考 //新建类 重写Npoi流方法 publ ...
- js的for in具有不适应性(转)
js中for in 可以遍历对象或数组的显性属性,也就是说我们自己定义的属性是可以遍历的,那些原型上默认已有的属性,例如:Object.prototype.toString.Object.protot ...
- BZOJ 1821 部落划分
kruskal.第k-1大的边. 其实prim会更快. #include<iostream> #include<cstdio> #include<cstring> ...
- 《C#高级编程》之泛型--1创建泛型类
.NET自从2.0版本开始就支持泛型. 非泛型链表 闲话休提,马上来看下非泛型的简化链表类,它可以包含任意类型的对象. LinkedListNode.cs中: 在链表中,一个元素引用另一个元素,所以必 ...
- Android telnet RPi 2B
/************************************************************************* * Android telnet RPi 2B * ...
- session共享,格式json,php不能简单的设置session.serialize_handler=json,目前只有php,wddx(xml),安装扩展后还有igbinary(二进制)
即使session_save_handler被自己的类或者方法重写,write与read的出入数据都还是被序列化的,而且被session序列化不是一般的序列化...还是不能解解决memcached保存 ...
- Java正则表达式之语法规则
正则表达式是一种强大而灵活的文本处理工具,使用正则表达式能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索.一旦找到了匹配这些模式的部分,就能够随心所欲地它们进行处理.正则表达式提供了一种 ...
- [转载] ffmpeg超详细综合教程——摄像头直播
本文的示例将实现:读取PC摄像头视频数据并以RTMP协议发送为直播流.示例包含了 1.ffmpeg的libavdevice的使用 2.视频解码.编码.推流的基本流程 具有较强的综合性. 要使用liba ...
- hdu 4927 java求组合数(大数)
import java.util.Scanner; import java.math.BigInteger; public class Main { private static int [] a = ...
- 对JAVA集合进行遍历删除时务必要用迭代器
java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...