Fibonacci again and again(博弈sg函数)

在这里插入图片描述
在这里插入图片描述

思路:

简单博弈的异或原理加上sg函数就可以,把每一堆石子看成一个单独子游戏。最后的结果就是sg[m],sg[n],sg[p]三者的异或和。
套一下sg函数的模板即可。

代码

#include<stdio.h>
#include<string.h>
int fib[30],s[1010];
bool mex[1010];
int n,m,p;
void getsg(int n)
{
    int i,j;
    for(i=1;i<=n;i++){
        memset(mex,0,sizeof(mex));
        for(j=1;fib[j]<=i;j++ )
            mex[s[i-fib[j]]]=1;
        for(j=0;j<=n;j++)
            if(!mex[j])
                break;
        s[i]=j;
    }
}
void init()
{
    fib[0]=1,fib[1]=1;
    for(int i=2;;++i){
        fib[i]=fib[i-1]+fib[i-2];
        if(fib[i]>1000)break;
    }
    memset(s,0,sizeof(s));
    getsg(1000);
}
int main()
{
    init();
    while(~scanf("%d%d%d",&m,&n,&p)&&(m+n+p)){
        if(s[m]^s[n]^s[p])
            printf("Fibo\n");
        else
            printf("Nacci\n");
    }
    return 0;
}
发布了85 篇原创文章 · 获赞 10 · 访问量 5230

猜你喜欢

转载自blog.csdn.net/riversuer/article/details/105186110