HDU 1848 Fibonacci again and again(每次只能取fibonacci数的NIM)

来源:互联网 发布:萧山网络问政查看 编辑:程序博客网 时间:2024/06/14 10:23

NIM博弈的变体,每次只能取Fibonacci数,思路还是通过SG函数来解决

#include <bits/stdc++.h>using namespace std;const int N=1001;int f[N],sg[N],HASH[N];void getSG(int n){    int i,j;    memset(sg,0,sizeof(sg));    for(i=1;i<=n;i++)    {        memset(HASH,0,sizeof(HASH));        for(j=1;f[j]<=i;j++)//标记所有可取到的状态mex函数            HASH[sg[i-f[j]]]=1;        for(j=0;j<=n;j++)//找到不在mex中的最小自然数        {            if(HASH[j]==0)            {                sg[i]=j;                break;            }        }    }}int main(){    std::ios::sync_with_stdio(false);    std::cin.tie(0);    f[0]=f[1]=1;    for(int i=2;i<=16;i++)    {        f[i]=f[i-1]+f[i-2];    }    getSG(1000);    int m,n,p;    while(cin>>m>>n>>p&&(m||n||p))    {        if(sg[m]^sg[n]^sg[p])//异或值等于零先手必败        {            cout<<"Fibo"<<endl;        }        else cout<<"Nacci"<<endl;    }    return 0;}
0 0