题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516
有一堆个数为n的石子,游戏双方轮流取石子,满足:
(1)先手不能在第一次把所有的石子取完;
(2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。 约定取走最后一个石子的人为赢家。
2、解决思路:
当n为Fibonacci数时,先手必败。即存在先手的必败态当且仅当石头个数为Fibonacci数。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<map>; using namespace std; int n,m,a[100005]; map<int,int> mp; int main(){ a[0]=1; a[1]=1; mp[1]=1; for(int i=2;i<=10000;i++){ a[i]=a[i-1]+a[i-2]; mp[a[i]]++; } while(cin>>n&&n){ if(mp[n])puts("Second win"); else puts("First win"); } return 0; }
原文:https://www.cnblogs.com/zjl192628928/p/10485737.html