斐波那契博弈论

如果这个数是斐波拉契数,那么先手就败的情况。
代码

#include<cstdio>
#include<map>
int fib[233],x;
std::map<int,bool>mp;
int main()
{
    fib[1]=1;fib[2]=1;
    for(int i=3;i<=50;i++) fib[i]=fib[i-1]+fib[i-2],mp[fib[i]]=1;
    while(scanf("%d",&x)&&x!=0)
        puts(mp[x]==1?"Second win":"First win");
    return 0;
}

证明:
比如 有21个石子 (21=13+8) 连续两个斐波拉契数13+8的和

首先有21个石子,我们肯定是不能让对手取最后一个石子的。(显而易见,不然这样我们就输了。)
那么21可以划分成21=13+8这两个数之和,我们肯定不能取>=8的石子,因为这样后手一下子会取完,
那么对于8这堆来说,我们也要不让对手取最后一颗石子,那么8又可以划分成8=5+3 连续斐波拉契数之和 ,那么我们肯定是不能取>=3的石子,因为那样后手一下子会取完,
那么对于3这一堆来说,我们也不要让对手取最后一颗石子,那么3又可以划分为3=2+1连续的斐波拉契数之和…
那么3又可以划分为3=2+1连续的斐波拉契数之和.,那么我们肯定不能取>=1的石子…

显而易见,和题目发生了冲突

我们再来证明如果这个数不是斐波拉契数,那么先手就赢的情况
根据“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。如n=83 = 55+21+5+2。

如果我们先手取掉最小的那堆2的话,那么对手怎么也不能把倒数第二堆取完,(因为它们不是连续的斐波拉契!)

那么就转化成了5个石头对手先取,5是斐波拉契数怎么取都是后手拿掉最后一个(这就转化成了第一种情况!) 同理21 55 你总能拿掉最后一颗。**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值