HDU 1848 Fibonacci again and again(博弈 SG运用)

来源:互联网 发布:淘宝店铺怎么删除分类 编辑:程序博客网 时间:2024/05/29 11:42

有3堆石头,每堆石头可以操作的方法都一样,且相互之间不会影响。

根据SG定理,把他分为3堆独立的石头。求SG函数,最后异或起来

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<functional>using namespace std;int f[20],s[1005],sg[1005];void GetSG(int n){int i,j;memset(sg,0,sizeof(sg));for(i=1;i<=n;i++){memset(s,0,sizeof(s));for(j=1;f[j]<=i&&j<=16;j++)s[sg[i-f[j]]]=1;for(j=0; ;j++)if(!s[j]){sg[i]=j;break;}}}int main(){int i,n,m,k;f[0]=1;f[1]=1;f[2]=2;for(i=3;i<=16;i++)//17已经超出范围f[i]=f[i-1]+f[i-2];GetSG(1000);while(scanf("%d%d%d",&n,&m,&k),n&&m&&k){if(sg[n]^sg[m]^sg[k])printf("Fibo\n");elseprintf("Nacci\n");}}