HDU 2516 取石子游戏(斐波那契博弈)

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

题目大意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win"。

解题思路:好吧,我是看别人找的规律。只要n不是斐波那契数,那先手必胜,反之先手必败。

 1 #include<cstdio>
 2 typedef long long LL;
 3 LL a[60]={0,1,2};
 4 
 5 void fib(void){
 6     for(int i=3;i<=50;i++){
 7         a[i]=a[i-1]+a[i-2];
 8     }
 9 } 
10 
11 int main(){
12     fib();
13     int n;
14     while(~scanf("%d",&n)&&n){    
15         bool flag=true;
16         for(int i=2;i<=50;i++){
17             if(a[i]==n)
18                 flag=false;
19         }
20         if(flag)
21             puts("First win");
22         else
23             puts("Second win");
24     }
25     return 0;
26 }

 

posted @ 2017-09-05 15:10  Yeader  阅读(140)  评论(0编辑  收藏  举报