HDU-1848-组合博弈

来源:互联网 发布:阿里云服务器建站 编辑:程序博客网 时间:2024/06/01 07:37

题目大意:有三堆石子,两个人轮流取一堆石子中只能为斐波那契数的石子,问最后谁赢;

题目解析:预处理f函数和sg函数,直接把三堆石子的sg函数异或起来判断是否为0;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;const int N=1010; int f[N];int sg[N];int Hash[N];    void getSG(int n){      memset(sg,0,sizeof(sg));      for(int i = 1; i <= n; i++){          memset(Hash,0,sizeof(Hash));          for(int j = 1; f[j] <= i; j++)              Hash[sg[i-f[j]]] = 1;          for(int j = 0; j <= n; j++){                 if(Hash[j] == 0){                  sg[i] = j;                  break;              }          }      }  } void init(){f[1]=f[0]=1;for(int i=2;i<=16;i++)f[i]=f[i-1]+f[i-2];getSG(1000);}int main(){init();int a,b,c;while(scanf("%d%d%d",&a,&b,&c)!=EOF){if(a==0&&b==0&&c==0)break;if(sg[a]^sg[b]^sg[c])printf("Fibo\n");else printf("Nacci\n");}return 0;}