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
- hdu-2516 斐波那契数sg值
- hdu 1316 斐波那契数
- hdu 2516 博弈。斐波那契数
- hdu1848(斐波那契数列+SG函数)
- hdu - 4639 - Hehe(斐波那契数)
- hdu 4983 线段树+斐波那契数
- Nim游戏、斐波那契数列和求sg值
- hdu 2516 取石子游戏 博弈 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- 斐波那契数
- python-基础-操作mysql数据库
- 汉明码校验C代码
- 优先队列
- c++中接口的作用
- Android 之开发环境的搭建
- hdu-2516 斐波那契数sg值
- 德国的嘎嘎是嘎啊是我情人无情无日期为任务
- 深入理解python之self
- Linux下安装*.bin/*.sh格式文件
- uva10391Compound Words
- 手贱 + 做事不认真想想后果 == 悲剧!
- Activity生命周期
- 常用的脚本
- sitemesh struts2 整合