Problem Description 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///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////找規律:n =2時輸出second;
n =3時也是輸出second;
n =4時,第一個人想獲勝就必須先拿1個,這時剩餘的石子數為3,此時無論第二個人如何取,第一個人都能贏,輸出first;
n =5時,first不可能獲勝,因為他取2時,second直接取掉剩下的3個就會獲勝,當他取1時,這樣就變成了n為4的情形,所以輸出的是second;
n =6時,first只要去掉1個,就可以讓局勢變成n為5的情形,所以輸出的是first;
n =7時,first取掉2個,局勢變成n為5的情形,故first贏,所以輸出的是first;
n =8時,當first取1的時候,局勢變為7的情形,第二個人可贏,first取2的時候,局勢變成n為6得到情形,也是第二個人贏,取3的時候,second直接取掉剩下的5個,所以n =8時,輸出的是second;
…………
從上面的分析可以看出,n為2、3、5、8時,這些都是輸出second,即必敗點,仔細的人會發現這些滿足斐波那契數的規律,可以推斷13也是一個必敗點。
n =12時,只要誰能使石子剩下8且此次取子沒超過3就能獲勝。因此可以把12看成8+4,把8看成一個站,等價與對4進行”氣喘操作“。
又如13,13=8+5,5本來就是必敗態,得出13也是必敗態。
也就是說,只要是斐波那契數,都是必敗點。
所以我們可以利用斐波那契數的公式:fib[i]=fib[i-1]+fib[i-2],只要n是斐波那契數就輸出second。
代碼:
#include<iostream>
using namespace std;
long long n,f[45]={2,3};
int main()
{
int i;
for(i=2;i<45;i++)
{
f[i]=f[i-1]+f[i-2];
}
while(scanf("%lld",&n)!=EOF)
{
if(n==0)
break;
for(i=0;i<45;i++)
{
if(f[i]==n)
{
cout<<"Second win"<<endl;
break;
}
}
if(i==45)
cout<<"First win"<<endl;
}
return 0;
}