题意:1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。
取完者胜.先取者负输出"Second win".先取者胜输出"First win".
思路:如果不知道斐波那契博弈的话,这题也可以一个个手算下小数据,就会发现必败态都是当石子数为斐波那契数。
关于斐波那契博弈的证明:点击打开链接
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x7fffffff;
const int maxn = 1e3+5;
ll fib[maxn] = {1, 2};
int main(void)
{
set<ll> s;
s.insert(1);
s.insert(2);
for(int i = 2; i < maxn; i++)
{
fib[i] = fib[i-1]+fib[i-2];
if(fib[i] > INF) break;
s.insert(fib[i]);
}
ll n;
while(cin >> n && n)
{
if(s.find(n) != s.end()) puts("Second win");
else puts("First win");
}
return 0;
}