1. 程式人生 > >取石子遊戲 HDU2516(斐波那契博弈)

取石子遊戲 HDU2516(斐波那契博弈)

裸題 左右 get code span target oid otto HR

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2516

題目:

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 思路:斐波那契博弈裸題,先手必勝的條件為n不是一個斐波那契數。因此,我們先打表,求出1~2^31次方內的所有斐波那契數求出來,然後一邊循環即可,因為易知斐波那契數列增長極快,到50項左右時就已經爆int了,所以進行遍歷時復雜度為常數級。 代碼實現如下:
 1 #include <cstdio>
 2 
 3 int n;
 4 int a[55];
 5 
 6 void
init() { 7 a[0] = 2, a[1] = 3; 8 for(int i = 2; i <= 45; i++) { 9 a[i] = a[i-1] + a[i-2]; 10 } 11 } 12 13 int main() { 14 init(); 15 while(~scanf("%lld", &n) && n) { 16 int flag = 1; 17 for(int i = 0; i <= 45; i++) { 18 if
(a[i] == n) { 19 puts("Second win"); 20 flag = 0; 21 break; 22 } 23 } 24 if(flag) puts("First win"); 25 } 26 return 0; 27 }

取石子遊戲 HDU2516(斐波那契博弈)