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

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

完者胜.先取者负输出"Second win".先取者胜输出"First win".


思路:如果不知道斐波那契博弈的话,这题也可以一个个手算下小数据,就会发现必败态都是当石子数为斐波那契数。

关于斐波那契博弈的证明:点击打开链接


代码:

#include
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 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;
}


你可能感兴趣的:(博弈)