[转自大牛博客] 【NIM】一个NP问题的简解
来源:互联网 发布:阿里健康云药师兼职 编辑:程序博客网 时间:2024/05/02 00:03
膜拜大牛Orz 居然用手推规律Orz
题目大意:在n颗石子中,第一次可取1到n-1颗,之后每次取的不超过上一次取的石子数。取完的获胜。
给出结论:当n为2的k次方时,是必败局面,否则先手必胜。(k>=1)
证明:
首先,考虑n为奇数时,每次取1,对手下一次也只能取1,必胜。
否则n即为偶数,是2的k1倍。
当k1为奇数时,是必胜策略,因为每次取2,最终由先手取完,要是其中某次后手不取2,取1,便转移到奇数的局面,还是先手胜利。
所以2的奇数倍是必胜态。
剩下2的偶数倍,是4的k2倍。
同理,当k1为奇数时,同样是必胜策略。奇数不能取,取2的话,剩下的为2的奇数倍,是必胜态。
再考虑4,8,16……的偶数倍。
得到一个类似数学归纳法证明的结论:
当n为2的1到k次方的奇数倍都为必胜态时,则n为2的k+1次方的奇数倍也为必胜态。
因为:
当先手取2的k+1次方后,后手不取2的k+1次方,就必定转移到其他的必胜态(之前2的某次方的奇数倍),或者一直取下去,也是先手取完。
当然,当n恰为2的k次方时,一次是取不了2的k次方的,所以只能转移到之前的2的某次方的奇数倍。
和hlq大神讨论了另外一种二进制解法。与lowbit 相关。
在二进制下,先手取最后一个1就能够获胜。
取的是第k位,之后的全部都会是0.
把取第k位两次,从0取为1,再从1取回0.看做一个过程,无疑这个会导致前面的退位。
我们先考虑只取第k位,暂时不取k位之后的。
k位之前的部分代表的数,就是这个过程的倍数。每个过程都包括先手和后手都取一次。
当最后取完时,进行了若干次完整的过程。可以看做先手是先将1取成0,之后先后手进行若干次过程(后手取为1,先手再取回0)。所以先手是必胜的。
假设后手不取第k位,反而取后面一个更小的位。
因为取的是最后一个1,所以后面都是0,后手便把某一位0取做了1,先手只需再将最后一位1取做0,便是和上面论述的一样的问题。
因为2的n次方,是只有第一位为1的二进制数,并且规则规定我们取不到那一位,所以先手只能取到一个0位,必败。
- [转自大牛博客] 【NIM】一个NP问题的简解
- 【NIM】一个NP问题的简解
- 转自大牛
- 一位ACMER的心得(转自大牛)
- JAVA项目经验(转自大牛的经验分享)
- 第九届MPD软件工作坊总结-转自大象的博客
- 转载自大牛的博文-解决大批量插入数据到数据库中的问题
- 一个问题P-hard以及NP-hard的解释
- 算法:一个NP问题的证明(课后习题)
- NP问题与NP-hard的关系
- 澄清P问题、NP问题、NPC问题的概念(转)
- CS结构的在线升级[转自大富翁论坛]
- (转)P.NP.NP-Complete.NP-Hard的定义
- NP问题,不可解问题
- Android sqlite应用详解(转自大牛SCOTT)
- NP困难问题的理解
- NP完全问题的特殊性
- 有趣的NP完全问题
- HTML5 Boilerplate - 让页面有个好的开始
- error:js程序无法运行
- Perl 箭头符号
- 短信
- 决策树归纳(ID3属性选择度量)Java实现
- [转自大牛博客] 【NIM】一个NP问题的简解
- Centos6.3搭建SVN服务器
- jQuery遮罩代码
- apue学习第五天——UNIX标准及实现(第二章)
- Linux callstack 使用 [User space]
- yii+mySQL使用过程中问题总结
- 创业概念:跑马拉松和创业的相似之处
- STM32 延时函数封装
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)