[QSCOJ39]喵哈哈村的代码传说 第五章 找规律
2017-09-29 15:32
260 查看
题目大意:
给你n堆排,两人轮流对其中一堆牌进行以下操作之一:
1.从这堆牌中取出任意数量的牌;
2.将这这堆牌分为任意大小的3堆牌。
不能操作者负。
问先手是否有必胜策略。
思路:
尝试构造sg函数,游戏的状态为某堆牌中牌的数量,
打表计算发现当x为8的倍数时,sg(x)=x-1;
当x在模8意义下为7时,sg(x)=x+1;
否则sg(x)=x。
手算了以下x=0~8时的情况,解释如下:
当x=0时,先手没法操作,sg(x)=0;
当x=1时,当前的后继状态为(0),sg(x)=mex{sg(0)}=1;
当x=2时,当前的后继状态为(0)(1),sg(x)=mex{sg(0),sg(1)}=2;
当x=3时,当前的后继状态为(0)(1)(2)(1 1 1),sg(x)=mex{sg(0),sg(1),sg(2),...,sg(1)^sg(1)^sg(1)}=3;
……
当x=7时,当前的后继状态为(0)~(6)(1 1 5)(1 2 4)(1 3 5)(2 2 3),此时(1 2 4)所对应的sg值为sg(1)^sg(2)^sg(4),sg(7)=8;
而当x=8时,当前的后继状态中(7)的sg值为8,而其它的后继状态中sg值也没有等于7的,所以sg(x)=7。
程序实现十分简单。
#include<cstdio> #include<cctype> inline int getint() { register char ch; while(!isdigit(ch=getchar())); register int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } inline int getsg(const int &x) { if(x%8==0) return x-1; if(x%8==7) return x+1; return x; } int main() { for(register int T=getint();T;T--) { int ans=0; for(register int n=getint();n;n--) { ans^=getsg(getint()); } puts(ans?"First player wins.":"Second player wins."); } return 0; }
相关文章推荐
- 【qscoj】喵哈哈村的代码传说 第二章 神经网络
- 喵哈哈村的代码传说 第四章 并查集
- 西蒙OpenGL ES教程第五章的示例代码显示不了纹理
- 传说中的华为面试题(8分钟写出代码)
- 传说中较快点的代码
- c++ Primer Plus(第六版)第五章习题,写代码之路
- 统计学习方法第五章CART算法代码实践例题5.4
- 《JQuery基础教程》第四版课后练习代码--第五章
- 第一行代码 第五章 广播
- UNIX-LINUX编程实践教程->第五章->实例代码注解->echostate.c
- 请你不要侮辱我的劳动成果侮辱我的程序代码,我不是传说中的菜鸟,请你不要对我进行人身攻击。
- Java2实用教程(第二版)程序代码——第五章 数组与字符串
- TestNG系列-第五章 测试方法、测试类和测试分组(续6)-代码运行TestNG和BeanShell
- OpenGL蓝宝书第五章代码勘误以及惯性坐标系去解释模型变换:Pyramid.cpp
- Essential C++ 第五章代码
- UNIX-LINUX编程实践教程->第五章->实例代码注解->setecho.c
- python学习第五章操作列表部分课后练习自己尝试的代码
- OpenGL蓝宝书第五章5.4Tunnuel 纹理映射和过滤:较好的可读性代码
- 第二行代码学习笔记——第五章:全局大喇叭——详解广播机制
- int 10H 显示字符串功能在《自己动手写OS》第五章代码中的分析