您的位置:首页 > 其它

43 且听风吟之呆逼二三事

2017-11-03 14:14 148 查看



且听风吟之呆逼二三事

时间限制: 1000 ms 内存限制: 65536 kb

总通过人数: 127 总提交人数: 140


题目描述

wzc是Tera里且听风吟公会的会长,本着为会员着想的心理,努力发展公会,公会人数也是日益壮大,慢慢的就加入了各大公会战,野外打狗的行列。

但是公会的某个妹子突然被呆比抢走并且已经发展到线下了(hhhh

广大会员和会长怎么能忍,随着呆比的发展,渐渐不见他上线,所以大家偷偷决定将他驱逐公会,但是会长wzc是个民主的会长(权限狗),他决定打开公会仓库,让呆比拿走一些金子作为他两个月来的贡献,但是wzc比较大方(抠门),定了下面的规矩:

wzc和呆比轮流取金子,wzc先取,第1次可以取任意多的金币,但不能全部取完.以后每次取的金子不能超过上次取的2倍,如果最后是wzc取完那么呆比取到的金子就要还回来,反之呆比可以拿走取到的金子。假设呆比和wzc都竭尽全力想要赢。

wzc沉迷于公会战和各种事物不能自拔所以需要你来判断呆比能不能全身而退。


输入

输入有多组

.每组1行只有一个数n,代表仓库里的金子数,wzc很穷(有钱)所以2<=n<2^31。


输出

如果wzc取完 则输出"Oh,yes!" 如果呆比取完 则输出"Oh,holly shit!"(我英语学的不好请原谅)


输入样例

2
10000


输出样例

Oh,holly shit!
Oh,yes!


解析

本题考察斐波那契博弈,所有的斐波那契数都是先手必败。用第二类数学归纳发可以证明,具体证明过程可以去搜索斐波那契博弈。本题2<=n<2^31,可以先写一个测试程序,计算2^31以内有多少个斐波那契数(不到50个),然后用数组储存所有的斐波那契数,判断n是不是斐波那契数即可。
参考代码:

#include <cstdio>

int main()
{
int n, c[50]={1,1}, st;

for (int i=2; i<50 && c[i-1]+c[i-2]<2147483648; i++) c[i]=c[i-2]+c[i-1];

while (scanf("%d", &n)==1){
st=0;
for (int i=0; i<50; i++) if (c[i]==n) st=1;
if (st==1) printf("Oh,holly shit!\n");
else printf("Oh,yes!\n");
}
}


本题考察斐波那契博弈,所有的斐波那契
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息