首页 > 其他分享 >hdu:Fibonacci again and again(nim博弈与斐波那契)

hdu:Fibonacci again and again(nim博弈与斐波那契)

时间:2022-12-02 23:22:07浏览次数:50  
标签:again hdu Nacci nim int Fibo Fibonacci 那契

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”,每个实例的输出占一行。


输入样例

1 1 1
1 4 1
0 0 0

输出样例

Fibo
Nacci

如果G是由Gi组成设gi为i游戏的sg值,则有G=g1^g2^...gi^gn
附ac代码
#include<bits/stdc++.h>
using namespace std;
int a[500],f[1010];
int k;
int sg(int p)
{
    bool g[1010]={0};
    for(int i=1;i<=k;++i)
    {
        int t=p-a[i];
        if(t<0) break;
        if(f[t]==-1) f[t]=sg(t);
        g[f[t]]=1;
    }
    for(int i=0;;++i)
    {
        if(!g[i])
        return i;
    }
}
void dfs(int p)
{
    if(f[p]==-1) f[p]=sg(p);
}
int main()
{
    a[1]=1;a[2]=2;
    int m,n,p;
    for(int i=3;;++i)
    {
        a[i]=a[i-1]+a[i-2];
        if(a[i]>1000) break;
        k=i;
    }
    memset(f,-1,sizeof(f));
    while(scanf("%d%d%d",&m,&n,&p)==3,m)
    {
        int ans;
        dfs(m);dfs(n);dfs(p);
        ans=f[m]^f[n]^f[p];
        if(!ans)
        printf("Nacci\n");
        else
        printf("Fibo\n");
    }
}

 

 

标签:again,hdu,Nacci,nim,int,Fibo,Fibonacci,那契
From: https://www.cnblogs.com/ruoye123456/p/16945982.html

相关文章

  • Reallusion Cartoon Animator for Mac(2D动画设计制作软件)中文激活版
    ReallusionCartoonAnimatorforMac是一款2D动画设计制作软件,艺术家,插画家,漫画家和设计师能够轻松地从静态图像,照片,绘画甚至分层的PhotoshoppsD创建可动画的2D角色。Carto......
  • HDU-5418 Floyd + DP
    题目传送门时间复杂度:\(O(2^n\cdotn^2)\)注意:输入尽量用scanf输入,输入需要记录两个路径的最小值代码:#include<iostream>#include<queue>#include<vector>#......
  • HDU 6273 Master of GCD(差分)
    题目分析贴一个别人的题解这个题就是一个差分数组,因为这数列的最大公约数就是这个数列2的出现2的最少次数的幂乘以3的出现3的最少次数的幂将2和3分开讨论,然后分......
  • [LeetCode] 1769. Minimum Number of Operations to Move All Balls to Each Box
    Youhave n boxes.Youaregivenabinarystring boxes oflength n,where boxes[i] is '0' ifthe ith boxis empty,and '1' ifitcontains one ba......
  • hdu最佳编码(哈夫曼编码)
    ProblemDescription文本编码是计算机通信中的常见问题。以文本“AAAAABCD”为例,如果使用ASCII,则一共需要64位(因为每个字符的ASCII编码都是需要8位)。对应的,如果我们将......
  • hdu棋盘游戏(二分图匹配)
    题目描述ProblemDescription小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限......
  • hdu 5418 Victor and World
    hdu5418VictorandWorldTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:262144/131072K(Java/Others)链接:http://acm.hdu.edu.cn/showproblem.php?pi......
  • Unity Animator -- Apply Root Motion
    Animator.ApplyRootMotion这个属性是用来控制物体在播放骨骼动画的时候是否应用骨骼根节点的运动参数。一、当没有骨骼根节点的情况时,比如只是一个Cube立方体,如果勾选了Appl......
  • Unity-Animator Override Controller
    AnimatorOverrideController是一种资产类型,允许您扩展现有的AnimatorController,替换使用的特定动画,但保留原始结构,参数和逻辑。允许您创建相同基本状态机的多个变体,但每......
  • [LeetCode] 1758. Minimum Changes To Make Alternating Binary String
    Youaregivenastring s consistingonlyofthecharacters '0' and '1'.Inoneoperation,youcanchangeany '0' to '1' orviceversa.Thestringisc......