1. 程式人生 > >hdu 2516 取石子遊戲 (Fibonacci博弈)

hdu 2516 取石子遊戲 (Fibonacci博弈)

main content cal scrip mat rip mes c++ ota

取石子遊戲

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 }

hdu 2516 取石子遊戲 (Fibonacci博弈)