IT民工
加油!
/*
当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;
}
posted on 2012-10-22 13:06  找回失去的  阅读(294)  评论(0编辑  收藏  举报