hdu 2516 FIB博弈

分析请看:cxlove

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 #include<string>
 8 #include<map>
 9 #define LL long long
10 #define N 1000000
11 #define inf 1<<20
12 using namespace std;
13 int fib[50];
14 int main(){
15     fib[0]=1;fib[1]=2;
16     for(int i=2;i<45;i++)
17         fib[i]=fib[i-1]+fib[i-2];
18     int n;
19     while(scanf("%d",&n)!=EOF&&n){
20         int i=0;
21         for(i=0;i<45;i++)
22             if(fib[i]==n)
23                 break;
24         if(i<45)
25             puts("Second win");
26         else
27             puts("First win");
28     }
29     return 0;
30 }
时间: 2024-10-06 12:57:41

hdu 2516 FIB博弈的相关文章

hdu 2516 FIB博弈模型

题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=2516 分析: 当石子个数为 fabonacii 数时, 为必败态. 代码如下: LL fib[60] ; void init(){ int i; fib[0] = fib[1] = 1 ; for( i=2 ;i < 55; i++){ fib[i] = fib[i-1] + fib[i - 2] ; } } int main() { init() ; int n , i; while(scanf

HDU 2516 (博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2994    Accepted Submission(s): 1748 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不

HDU 2516 取石子游戏(斐波那契博弈)

题目地址:HDU 2516 当且只当n是一个斐波那契数的时候是必败态.可以写出几组数据找规律就可以发现这个规律. 证明如下: 就像"Wythoff博弈"需要"Beatty定理"来帮忙一样,这里需要借助"Zeckendorf定理"(齐肯多夫定理):任何正整数可以表示为若干个不连续的Fibonacci数之和. 先看看FIB数列的必败证明: 1.当i=2时,先手只能取1颗,显然必败,结论成立. 2.假设当i<=k时,结论成立. 则当i=k+1时,

hdu 2516(斐波拉切博弈)

题意:容易理解. 分析:通过枚举寻找规律,这就是做1堆或者2堆石子博弈的技巧!当为2或者3时,肯定是第二个人赢,当为4时,先去一个石子,然后当对方面临3,于是第一个人赢, 当为5时,取1时,第二个人赢,取2时也是第二个人赢...,于是为5时也是滴二个人赢...多枚举几个之后就会发现只要满足斐波拉切数列的都是第二个人赢,其它的 则是第一个人赢! 代码实现: #include<stdio.h> #include<string.h> int main() { int n,i,t1,t2,

HDU 2516 取石子游戏(巴什博弈)

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2524    Accepted Submission(s): 1443 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win&q

取石子游戏(hdu2516+FIB博弈)

G - 取石子游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2516 Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出"First win".

hdu 3032(博弈sg函数)

题意:与原来基本的尼姆博弈不同的是,可以将一堆石子分成两堆石子也算一步操作,其它的都是一样的. 分析:由于石子的堆数和每一堆石子的数量都很大,所以肯定不能用搜索去求sg函数,现在我们只能通过找规律的办法求得sg的规律. 通过打表找规律可以得到如下规律:if(x%4==0) sg[x]=x-1; if(x%4==1||x%4==2) sg[x]=x; if(x%4==3) sg[x] = x+1. 打表代码: #include<iostream> #include<cstdio> #

hdu 2516 最小费用最大流

原来这个代码超时 #include<stdio.h> #include<queue> #include<string.h> using namespace std; #define N 200 #define inf 0x3fffffff int cap[N][N]; int fee[N][N]; int s,t,sum,pre[N]; int spfa() { queue<int>q; int dis[N],visit[N],u,i; memset(pre

HDU 2516 取石子游戏 (斐波那契博弈)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出"First win". Input输入有多组.每组第1行是2<=n<2^31. n=0退出. Output先取者负输出"Second win". 先取者胜输