hdu 2516 取石子游戏 (Fibonacci博弈)

取石子游戏

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8159    Accepted Submission(s): 4950


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 Input
2
13
10000
0
 
Sample Output
Second win
Second win
First win

 

C/C++:

 1 #include <map>
 2 #include <queue>
 3 #include <cmath>
 4 #include <vector>
 5 #include <string>
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <climits>
 9 #include <iostream>
10 #include <algorithm>
11 #define INF 0x3f3f3f3f
12 #define LL long long
13 #define wzf ((1 + sqrt(5.0)) / 2.0)
14 using namespace std;
15 
16 __int64 n, fib[45] = {1, 1};
17 
18 void calc()
19 {
20     for (__int64 i = 2; i <= 46; ++ i)
21         fib[i] = fib[i - 1] + fib[i - 2];
22 }
23 
24 bool is_fib()
25 {
26     for (__int64 i = 2; i <= 45; ++ i)
27     {
28         if (fib[i] > n) return false;
29         if (n == fib[i])
30             return true;
31     }
32     return false;
33 }
34 
35 int main()
36 {
37     calc();
38     while (scanf("%I64d", &n), n)
39     {
40         if (is_fib())
41             printf("Second win\n");
42         else
43             printf("First win\n");
44     }
45     return 0;
46 }

 C/C++:

 1 #include <map>
 2 #include <set>
 3 #include <queue>
 4 #include <cmath>
 5 #include <vector>
 6 #include <string>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <climits>
10 #include <iostream>
11 #include <algorithm>
12 #define INF 0x3f3f3f3f
13 #define LL long long
14 using namespace std;
15 
16 __int64 n, num[100] = {1, 1};
17 
18 set <__int64> s;
19 
20 void calc()
21 {
22     s.insert(1);
23     for (int i = 2; i <= 45; ++ i)
24     {
25         num[i] = num[i - 1] + num[i - 2];
26         s.insert(num[i]);
27     }
28 }
29 
30 int main()
31 {
32     calc();
33     while (scanf("%I64d", &n), n)
34     {
35         if (s.find(n) != s.end())
36             printf("Second win\n");
37         else
38             printf("First win\n");
39     }
40     return 0;
41 }

 

posted @ 2018-08-30 00:42  GetcharZp  阅读(144)  评论(0编辑  收藏  举报