HDU 1848 斐波那契博弈

斐波那契数列数列博弈:给你三堆石子,每次只能取费波契数列个石子,问先手赢输出“Fibo”,否则输出“Nacci”。

主要求出SG函数,然后看 异或值 ,最后根据异或值是否是 0 

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int f[20];
int sg[1050], mex[1050];
int main()
{
    int m,n,p;
    for(int i = 0; i <= 15; i++) //递推求斐波那契数列
        if(i == 0 || i ==1)
            f[i] = 1;
        else
            f[i] = f[i-1] + f[i-2];

    for(int i = 1; i <= 1000; i++)  //从小到大递推每个状态
    {
        memset(mex,0,sizeof(mex));  // 清空 mex
        for(int j = 1; j <= 15; j++)
            if(i >= f[j])   //石子数大于等于取的石子数,把后继的 放入 mex中
                mex[sg[i-f[j]]] = 1;
        for(int j = 0; j <= 1000; j++)  //求出该状态下 sg值
            if(!mex[j])
            {
                sg[i] = j;
                break;
            }
    }

    while(~scanf("%d%d%d",&m,&n,&p))
    {
        if(!m && !n && !p) return 0;
        if(!(sg[m]^sg[n]^sg[p])) puts("Nacci");
        else puts("Fibo");

    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/Edviv/p/11689362.html