思路:

第一堆:SG = n % 3;

第二堆:无规律,打表即可,用hash比set快很多;

第三堆:SG = n;

第四堆:无规律

第五堆:SG = n % 2;

第六堆:SG = n % (i + 1 ),i表示第i堆;

AC代码:

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 1e3 + 5;
void in(int &a) {
	char ch;
	while((ch=getchar()) < '0' || ch >'9');
	for(a = 0; ch >= '0' && ch <= '9'; ch = getchar()) {
		a = a * 10 + ch - '0';
	}
}
int f[100], SG[2][maxn], o[maxn];
void init() {
	set<int>s;
	f[0] = 1;
	f[1] = 2;
	SG[0][0] = SG[1][0] = 0;
	for(int i = 2; i < 100; ++i) f[i] = f[i-1] + f[i-2];
	//斐波那契
	for(int i = 1; i <= 1000; ++i) {
		s.clear();
		for(int j = 0; j < 100; ++j) {
			if(f[j] > i) break;
			s.insert(SG[0][i-f[j]]);
		}
		for(int j = 0; j <= 1000; ++j) {
			if(!s.count(j)) {
				SG[0][i] = j;
				break;
			}
		}
	}

	//偶数
	o[0] = 1;
	for(int i = 1; i <= 600; ++i) o[i] = i * 2;
	for(int i = 1; i <= 1000; ++i) {
		s.clear();
		for(int j = 0; j < 550; ++j) {
			if(o[j] > i) break;
			s.insert(SG[1][i-o[j]]);
		}
		for(int j = 0; j <= 1000; ++j) {
			if(!s.count(j)) {
				SG[1][i] = j;
				break;
			}
		}
	}
}

int main() {
	init();
	int n;
	while(scanf("%d", &n) == 1 && n) {
		int x, res = 0;
		for(int i = 1; i <= n; ++i) {
			in(x);
			switch(i){
				case 1: res ^= x%3; break;
				case 2: res ^= SG[0][x]; break;
				case 3: res ^= x; break;
				case 4: res ^= SG[1][x]; break;
				case 5: res ^= x%2; break;
				default: res ^= x % (i+1); break;
			}
		}

		if(res) printf("Yougth\n");
		else printf("Hrdv\n");
	}
	return 0;
}

如有不当之处欢迎指出!

nyoj913 取石子(十) SG函数 + Nimm博弈的更多相关文章

  1. BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 871  Solved: 365[Submit][Status][Discuss] Description ...

  2. BZOJ 1874 取石子游戏 - SG函数

    Description $N$堆石子, $M$种取石子的方式, 最后取石子的人赢, 问先手是否必胜 $A_i <= 1000$,$ B_i <= 10$ Solution 由于数据很小, ...

  3. nyoj135 取石子(二) Nimm博弈

    思路:计算每堆石子的SG值,然后异或得到总的SG值,如果SG=0则输,否则赢. 每堆石子的SG值等于m%(n+1),可以自己推算一下. AC代码 #include <cstdio> #in ...

  4. nyoj585 取石子(六) Nimm博弈

    此题数据十分极限,需要优化,否则会超时.关于此题的不足:明明说的每堆石子数不超过100,我开一个105大小的数组想用哈希居然Runtime Error!! 后来看见有人说需要优化输入: void in ...

  5. bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 733  Solved: 451[Submit][Status ...

  6. POJ.1067 取石子游戏 (博弈论 威佐夫博弈)

    POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...

  7. HDU 1848 Fibonacci again and again SG函数做博弈

    传送门 题意: 有三堆石子,双方轮流从某堆石子中去f个石子,直到不能取,问先手是否必胜,其中f为斐波那契数. 思路: 利用SG函数求解即可. /* * @Author: chenkexing * @D ...

  8. HDU-1848-Fibonacci again and again(SG函数,博弈)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意: 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样 ...

  9. 【POJ1067】取石子游戏 (威佐夫博弈)

    [题目] Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的 ...

随机推荐

  1. python_6_字符串

    什么是字符串? --一般用户输入数据和一堆有意义或者没有意义的文字符号组合 对字符串有哪些操作? --字符串本身不能修改,可以切片,可以读取 -- .capitalize()              ...

  2. IDEA新建Maven项目

    Maven是什么? 当我们在开发一个项目的时候,不可避免地会使用到第三方的类库,而它们又可能依赖着另外的Jar包,又得引入其他Jar包,而且我们很容易就会引漏掉~然后就会报错,有时候报的错会让我们花掉 ...

  3. selenium-java web自动化测试工具

    本篇文章由来,这两天整理了下自己经常使用而且很熟练的项目,今天突然想起漏了一个,补上了,但想到还没对应的博客,那就写一个简单的 我经常使用且相对熟练的部分技术如下(不知道算不算各位大神眼中的辣鸡): ...

  4. 百度网盘不限速下载软件 Pan Download

    百度网盘不限速下载软件 Pan Download Pan Download下载软件是一款电脑端的快速下载器软件,您可以通过Pan Download直接下载百度网盘中的资源,此款软件下载速度快,下载压缩 ...

  5. GO开发:用go写个日志监控系统

    日志收集系统架构 1.项目背景 a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题 b. 当系统机器比较少时,登陆到服务器上查看即可满足 c. 当系统机器规模巨大,登陆到机器上查看几乎不现 ...

  6. Linux 下定时备份数据库以及删除缓存

    一.定时备份数据库 1.在根目录下创建备份文件夹 #mkdir backup 2.进入到该目录下,创建backup.sh文件 3.赋予文件权限让其变成可执行文件 4.在backup.sh中写备份的脚本 ...

  7. Django中不返回QuerySets的API -- Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...

  8. JAVA并发编程学习笔记------对象的可见性及发布逸出

    一.非原子的64位操作: 当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值,这种安全性保证被称为最低安全性.最低安全性适用于绝大多数变量 ...

  9. MySQL连接数实时查看

      MySQL连接数实时查看 1.查看当前所有连接详细信息,只显示10个 2.查看连接状态 箭头所指的地方一般最重要,表示当前的连接数有多少个 3.查看所有连接的详细信息 4.实时查看连接详细信息 这 ...

  10. SpringMVC源码情操陶冶-AbstractUrlHandlerMapping

    承接前文SpringMVC源码情操陶冶-AbstractHandlerMapping,前文主要讲解了如何获取handler处理对象,本文将针对beanName注册为handler对象作下解析 Abst ...