取石子(五)(nyoj 358)
2014-03-08 15:50
204 查看
部分引用自:点击打开链接
有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:
1)先手不能在第一次把所有的石子取完,至少取1颗;
2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。
约定取走最后一个石子的人为赢家,求必败态。
结论:当n为Fibonacci数的时候,必败。
f[i]:1,2,3,5,8,13,21,34,55,89……
当n不是Fibonacci数的时候,借助“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。
分解的时候,要取尽量大的Fibonacci数。
比如分解85:85在55和89之间,于是可以写成85=55+30,然后继续分解30,30在21和34之间,所以可以写成30=21+9,
依此类推,最后分解成85=55+21+8+1。
则我们可以把n写成 n = f[a1]+f[a2]+……+f[ap]。(a1>a2>……>ap)
我们令先手先取完f[ap],即最小的这一堆。由于各个f之间不连续,则a(p-1) > ap + 1,则有f[a(p-1)] > 2*f[ap]。即后手只能取f[a(p-1)]这一堆,且不能一次取完。
此时后手相当于面临这个子游戏(只有f[a(p-1)]这一堆石子,且后手先取)的必败态,即先手一定可以取到这一堆的最后一颗石子。
同理可知,对于以后的每一堆,先手都可以取到这一堆的最后一颗石子,从而获得游戏的胜利。
斐波那契博弈(Fibonacci Nim)
有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:1)先手不能在第一次把所有的石子取完,至少取1颗;
2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。
约定取走最后一个石子的人为赢家,求必败态。
结论:当n为Fibonacci数的时候,必败。
f[i]:1,2,3,5,8,13,21,34,55,89……
当n不是Fibonacci数的时候,借助“Zeckendorf定理”(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和。
分解的时候,要取尽量大的Fibonacci数。
比如分解85:85在55和89之间,于是可以写成85=55+30,然后继续分解30,30在21和34之间,所以可以写成30=21+9,
依此类推,最后分解成85=55+21+8+1。
则我们可以把n写成 n = f[a1]+f[a2]+……+f[ap]。(a1>a2>……>ap)
我们令先手先取完f[ap],即最小的这一堆。由于各个f之间不连续,则a(p-1) > ap + 1,则有f[a(p-1)] > 2*f[ap]。即后手只能取f[a(p-1)]这一堆,且不能一次取完。
此时后手相当于面临这个子游戏(只有f[a(p-1)]这一堆石子,且后手先取)的必败态,即先手一定可以取到这一堆的最后一颗石子。
同理可知,对于以后的每一堆,先手都可以取到这一堆的最后一颗石子,从而获得游戏的胜利。
#include <stdio.h> long long a[100]; int main (void) { int i; a[0] = 0; a[1] = 1; for(i = 2; i < 100; i++) { a[i] = a[i - 1] + a[i - 2]; //printf("%lld\n", a[i]); } long long n; while(scanf("%lld", &n) != EOF) { int f = 0; for(i = 2; i < 100; i ++) { if(a[i] == n) { f = 1; printf("No\n"); break; } } if(f == 0) printf("Yes\n"); } return 0; }
相关文章推荐
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- NYOJ 358 取石子(五)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj358 取石子(五) 斐波那契博弈
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj-358 取石子(五)(斐波那契博弈)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- NYOJ 358 取石子(五)(斐波那契博弈)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- NYOJ 题目358 取石子(五)(博弈)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- NYOJ题目358 取石子(五)hdu题目2516 取石子游戏 Fibonacci’s Game(斐波那契博弈)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)
- nyoj 358 取石子(五)(Fibonacci博弈)(博弈——找规律)