hdu1848(求sg)

来源:互联网 发布:背头适合什么脸型 知乎 编辑:程序博客网 时间:2024/04/28 21:20

Fibonacci again and again
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6912 Accepted Submission(s): 2872

Problem Description
任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的:
F(1)=1;
F(2)=2;
F(n)=F(n-1)+F(n-2)(n>=3);
所以,1,2,3,5,8,13……就是菲波那契数列。
在HDOJ上有不少相关的题目,比如1005 Fibonacci again就是曾经的浙江省赛题。
今天,又一个关于Fibonacci的题目出现了,它是一个小游戏,定义如下:
1、 这是一个二人游戏;
2、 一共有3堆石子,数量分别是m, n, p个;
3、 两人轮流走;
4、 每走一步可以选择任意一堆石子,然后取走f个;
5、 f只能是菲波那契数列中的元素(即每次只能取1,2,3,5,8…等数量);
6、 最先取光所有石子的人为胜者;

假设双方都使用最优策略,请判断先手的人会赢还是后手的人会赢。

Input
输入数据包含多个测试用例,每个测试用例占一行,包含3个整数m,n,p(1<=m,n,p<=1000)。
m=n=p=0则表示输入结束。

Output
如果先手的人能赢,请输出“Fibo”,否则请输出“Nacci”,每个实例的输出占一行。

Sample Input

1 1 1
1 4 1
0 0 0

Sample Output

Fibo
Nacci

模版sg

/*    Name:    Copyright:    Author:    Date: 16/04/16 16:59    Description:*/#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef __int64 ll;#define rint(x) scanf("%d",&x);#define rll(x) scanf("%I64d",&x);#define rc(x) scanf("%c",&x);#define rd(x) scanf("%lf",&x);#define r(x) cin>>x;#define pint(x) printf("%d\n",x);#define pll(x) printf("%I64d\n",x);#define pint_(x) printf("%d",x);#define pll_(x) printf("%I64d",x);#define pc_(x) printf("%c",x);#define pc(x) printf("%c\n",x);#define pxn printf("\n");const int maxn=1005;int a[maxn];int b[maxn];int sg[maxn];int solve(int x){    if(sg[x]!=-1)return sg[x];    bool used[maxn];    memset(used,false,sizeof(used));    for(int i=0;i<=15;++i){        int temp=x-a[i];        if(temp<0)break;        ++used[solve(temp)];    }    for(int i=0;;++i){        if(!used[i]){            sg[x]=i;break;        }    }    return sg[x];}int main(){    int n,m,p;    a[0]=1;    a[1]=2;    for(int i=2;i<=15;++i){        a[i]=a[i-1]+a[i-2];    }    memset(sg,-1,sizeof(sg));    while(true){        rint(n);rint(m);rint(p);        if(n+m+p==0)break;        int ans=0;        ans^=solve(n);        ans^=solve(m);        ans^=solve(p);        if(ans)            printf("Fibo\n");        else printf("Nacci\n");    }    return 0;}
0 0
原创粉丝点击