#博弈论#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;
}
posted @ 2021-01-11 17:32  lemondinosaur  阅读(67)  评论(0编辑  收藏  举报