nyoj913 取石子(十) SG函数 + Nimm博弈
思路:
第一堆: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博弈的更多相关文章
- BZOJ 1874: [BeiJing2009 WinterCamp]取石子游戏(SG函数)
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 871 Solved: 365[Submit][Status][Discuss] Description ...
- BZOJ 1874 取石子游戏 - SG函数
Description $N$堆石子, $M$种取石子的方式, 最后取石子的人赢, 问先手是否必胜 $A_i <= 1000$,$ B_i <= 10$ Solution 由于数据很小, ...
- nyoj135 取石子(二) Nimm博弈
思路:计算每堆石子的SG值,然后异或得到总的SG值,如果SG=0则输,否则赢. 每堆石子的SG值等于m%(n+1),可以自己推算一下. AC代码 #include <cstdio> #in ...
- nyoj585 取石子(六) Nimm博弈
此题数据十分极限,需要优化,否则会超时.关于此题的不足:明明说的每堆石子数不超过100,我开一个105大小的数组想用哈希居然Runtime Error!! 后来看见有人说需要优化输入: void in ...
- bzoj 1188 [HNOI2007]分裂游戏(SG函数,博弈)
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 733 Solved: 451[Submit][Status ...
- POJ.1067 取石子游戏 (博弈论 威佐夫博弈)
POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...
- HDU 1848 Fibonacci again and again SG函数做博弈
传送门 题意: 有三堆石子,双方轮流从某堆石子中去f个石子,直到不能取,问先手是否必胜,其中f为斐波那契数. 思路: 利用SG函数求解即可. /* * @Author: chenkexing * @D ...
- HDU-1848-Fibonacci again and again(SG函数,博弈)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意: 任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样 ...
- 【POJ1067】取石子游戏 (威佐夫博弈)
[题目] Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的 ...
随机推荐
- libev学习笔记
转 libev的使用--结合Socket编程 作者:cxy450019566 之前自己学过一些libev编程的基础,这次写压测刚好用上了,才算真正动手写了些东西,在这里做一些总结.写这篇文章是为了用浅 ...
- disptch_after 自递归
NSArray *arr = @[@"1", @"2", @"3", @"4", @"5"]; ...
- Node.js系列-express(上)
前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...
- 知识点干货—多线程同步【6】之synchronized
"明日复明日,明日何其多. 我生待明日,万事成蹉跎. 世人若被明日累,春去秋来老将至. 朝看水东流,暮看日西坠. 百年明日能几何?请君听我明日歌. 明日复明日,明日何其多! 日日待明日,万世 ...
- @RequestMapping注解
Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容部分可以分为四类(主要讲解 ...
- Python之Suds库调用WCF时复杂参数序列化
今天主要做自动化测技术支持工作,最近一直在做接口自动化这块,前些天在研究将web页面模拟http进行接口自动化,这周杭州那边想测试WCF服务,所以这两天一直在探索.遇到的第一个问题就是服务参数传参序列 ...
- SpringMVC源码情操陶冶-ResourcesBeanDefinitionParser静态资源解析器
解析mvc:resources节点,控制对静态资源的映射访问 查看官方注释 /** * {@link org.springframework.beans.factory.xml.BeanDefinit ...
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示
1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 修改Auto Activation triggers for java的值为:zj ...
- 洛谷 [P2483] [模板] k短路
人生中的第一道黑题... 其实就是k短路模板 #include <iostream> #include <cstdio> #include <cstring> #i ...
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...