取石子(五)
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
himdd最近很想玩游戏,于是他找到acmj和他一起玩,游戏是这样的:有一堆石子,两个人轮流从其中取走一定的石子,取走最后所有石子的人为赢家,不过得遵循如下规则:
1.第一次取不能取完,至少取1颗.
2.从第二次开始,每个人取的石子数至少为1,至多为对手刚取的石子数的两倍。
himdd事先想知道自己会不会赢,你能帮帮他吗?(每次himdd先手)
-
输入
-
有多组测试数据,每组有一个整数n(2<=n<2^64);
输出
- himdd会赢输出Yes,否则输出No; 样例输入
-
2 5 6
样例输出
-
No No Yes
-
有多组测试数据,每组有一个整数n(2<=n<2^64);
先取者 :斐波纳契数列为必败点
/***************************
# 2013-8-25 11:33:04
# Time: 8MS Memory: 232KB
# Author: zyh
# Status: Accepted
***************************/
#include<stdio.h>
long long n,f[100];
int main()
{
f[0] = 2; f[1] = 3;
for(int i=2;i<100;i++){
f[i] = f[i-1] + f[i-2];
}
while(scanf("%lld",&n)!=EOF)
{
int flag = 1;
for(int i=0;i<100;i++){
if(f[i]==n) {
flag =0;
break;
}
}
printf("%s\n",!flag?"No":"Yes");
}
return 0;
}
取石子游戏
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2069 Accepted Submission(s): 1193
Problem Description
1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".
Input
输入有多组.每组第1行是2<=n<2^31. n=0退出.
Output
先取者负输出"Second win". 先取者胜输出"First win".
参看Sample Output.
参看Sample Output.
Sample Input
2 13 10000 0
Sample Output
Second win Second win First win
/***************************
# 2013-8-25 11:33:04
# Time: 0MS Memory: 228KB
# Author: zyh
# Status: Accepted
***************************/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
long long n,f[50];
int main()
{
f[0] = 2; f[1] = 3;
for(int i=2;i<45;i++){
f[i] = f[i-1] + f[i-2];
}
while(scanf("%lld",&n),n)
{
int flag = 1;
for(int i=0;i<45;i++){
if(f[i]==n) {
flag =0;
break;
}
}
printf("%s\n",!flag?"Second win":"First win");
}
return 0;
}