HDU 2516 取石子游戏

/*

当n为1的时候是输出first,n为2的时候输出second,

3的时候也是输出second,当n为4的时候,第一个人想获胜就必须先取

一个,这是剩余的石子数为3,此时无论第二个人如何取,第一个人都

能够赢,当n为5的时候,first不可能获胜,因为他取2时,second直接

取掉剩余的3个,取1时,second也是取1,这样就演变为n为3的时候了,

所以n为5时候,输出的是second ,当n为6的时候,first只要取掉1个,

就可以让局势变为n为5的时候,输出的是first,n为7的时候,first取掉

2个,又可以变为5的时候,所以也是输出first,n为8的时候,当first

取1个时候,局势变为7的时候,第二个人可以赢,取2时候,变为n为6的时

候,也是第二个人赢,取三个时候,second直接取掉剩余的5个,所以,n为

8的时候,是输出second。从上面可以看出,n为2,3,5,8时,这些都是输

出second,也就是说这些就是必败点,仔细的人会发现这些满足斐波那契数

的规律,可以推断13也是一个必败点,也就是说,只要是斐波那契数,都是

必败点,输出的就是second,所以,我们可以利用斐波那契数数的公式:

fib[i]=fib[i-1]+fib[i-2],只要n是斐波那契数,那就输出second.

*/

#include <stdio.h>



const int MAXN = 50;

typedef long long LL;

LL fib[MAXN];



int main()

{

    fib[0] = 2, fib[1] = 3; //直接从第三项2开始算起

    for(int i = 2; i <= 49; i ++)

        fib[i] = fib[i - 1] + fib[i - 2];

    LL n;

    while(scanf("%lld", &n), n)

    {

        int i;

        bool flag = false;

        for(i = 0; i < 50; i ++)

        {

            if(n == fib[i])

            {

                flag = true;

                break;

            }

        }

        if(flag) puts("Second win");

        else puts("First win");

    }

    return 0;

}

你可能感兴趣的:(HDU)