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

原题目:

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

Input

输入有多组.每组第1行是2<=n<2^31. n=0退出.

Output

先取者负输出"Second win". 先取者胜输出"First win".
参看Sample Output.

Sample Input

2
13
10000
0

Sample Output

Second win
Second win
First win
#include 
#include 
#include 
using namespace std;
__int64 a[50],len;
const __int64 inf = 2147483648+10;
int main()
{
    int i,j;
    __int64 n;
    a[1] = 1;
    a[2] = 1;
    for(i = 3; i<=1000000; i++)
    {
        a[i] = a[i-1]+a[i-2];
        if(a[i]>=inf)
            break;
    }
    len = i;
    while(~scanf("%I64d",&n),n)
    {
        int flag = 0;
        for(i = 1; in)
                break;
        }
        if(flag)
            printf("Second win\n");
        else
            printf("First win\n");
    }
    return 0;
}

思路:
斐波那契博弈

有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:

1)先手不能在第一次把所有的石子取完,至少取1颗;

2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。

约定取走最后一个石子的人为赢家,求必败态。

结论:当n为Fibonacci数的时候,必败。

f[i]:1,2,3,5,8,13,21,34,55,89……
记着吧

为什么在各种算法or技巧总结专栏里面

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