#博弈论#HDU 2516 取石子游戏
题目
\(n\)个石子,两人轮流取.先取者第1次可以取任意多个,
但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。
取完者胜.先取者负输出"Second win".先取者胜输出"First win".
分析
\(n\)为斐波那契数先手必败,否则先手必胜
dalao的证明
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
typedef unsigned uit; uit fib[51],n;
inline uit iut(){
rr uit ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
signed main(){
fib[1]=1,fib[2]=2;
for (rr uit i=3;i<48;++i) fib[i]=fib[i-1]+fib[i-2];
while (n=iut()){
rr uit t=lower_bound(fib+1,fib+48,n)-fib;
puts(fib[t]==n?"Second win":"First win");
}
return 0;
}