hdu-2516 斐波那契数sg值

来源:互联网 发布:156个援建项目 知乎 编辑:程序博客网 时间:2024/06/13 23:18

不管怎样,我是先写出了前十个数的情况。

发现2,3,5,8是必败态,因此猜想凡是n的值为 斐波那契数就是先手的必败态,否则为胜态。

猜想完成当然要验证了,接下来

先证:n为斐波那契额数时,先手必败

当n=2时,先手必败;

当n=3时,先手必败;

假设n=fib[k-1]时,先手必败;

假设n=fib[k-2]时,先手必败;

那么,

当n=fib[k]=fib[k-1]+fib[k-2];

因为fib[k-1]<2*fib[k-2];

所以不可能先手第一次取超过fab[k-2]的棋子;

这就回归到了fib[k-2]必败的问题。

显然这样操作先手必败,证毕;

再证n=非斐波那契数是必胜态;

由于“任一个正整数都可拆分为不连续的斐波那契额数之和”(Zeckendorf's theorem)

以n=20为例:n=13+5+2;

此时我可以取2,而对手至多可以取4,既让对手面临5的必败态,然后再让对手面临13的必败态;

其它整数证明类似;

即:n=f[a]+f[b]+...(已按从小到大排列)

先手取f[a],因为2*f[a]<f[b](a,b,不连续),故转变成了让后手面临斐波那契数组成的必败态。

证毕;

跳转http://yjq24.blogbus.com/logs/46150651.html

#include <cstdio>int fib[50]={0,1,1};int main (){int n;for(int i=3;i<=46;i++)//2^31之内只有46个fibonaccifib[i]=fab[i-1]+fab[i-2];while(scanf("%d",&n)&&n){int sign=1;for(int i=1;fib[i]<=n;i++)if(fib[i]==n){printf("Second win\n");sign=0;}if(sign)printf("First win\n");}return 0;}


0 0
原创粉丝点击