斐波那契博弈 :
有n个物品,先取者第一次可取任意个物品,但不能拿完,后面每一次取物品数都不大于前一次的2倍,先取完者获胜。
结论 :
当且仅当 n 为斐波那契数时,先取者获胜,否则,后取者获胜。
关于斐波那契博弈的证明可以参考一下 :
http://blog.csdn.net/u011762318/article/details/40189809
HDU-2516(取石子游戏)
题目大意 :
1堆石子有n(n < 2^31)个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win".
code :
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 long long num[50] = {0,1,1}; 5 int main() 6 { 7 for(int i = 2 ; i <= 47 ; i++) 8 num[i] = num[i-2] + num[i-1];//num[47] = 2 971 215 073 , 2^31 = 2 147 483 648 9 int n,i; 10 while(scanf("%d",&n) , n) 11 { 12 for(i = 3 ; i <= 46 ; i++) 13 { 14 if(n == num[i]) 15 { 16 printf("Second win "); 17 break; 18 } 19 } 20 if(i > 46) 21 printf("First win "); 22 } 23 return 0; 24 }