2 13 10000 0
Second win Second win First win
解题分析:
参考链接:http://fudq.blog.163.com/blog/static/191350238201191611358388/
当n为1的时候是输出first,
当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> #include<string.h> #define N 45 int num[N]; int main() { int i,n; memset(num,0,sizeof(num)); for(i=2,num[0]=2,num[1]=3;i<N;i++) { num[i]=num[i-1]+num[i-2]; } while(scanf("%d",&n),n!=0) { if(n==1) { printf("First win\n"); continue; } for(i=0;i<N;i++) { if(n==num[i]) break; } if(i==N) printf("First win\n"); else printf("Second win\n"); } system("pause"); return 0; }