您的位置:首页 > 大数据 > 人工智能

【HDU1848】Fibonacci again and again (博弈论)

2017-02-10 18:47 405 查看
题目大意:有3堆石头,两个人轮流取,每次取的数量只能是Fibonacci中的数,取完所有的人获胜,求先手胜负情况。

题解:SG定理裸题SG定理

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using std::max;
using std::swap;
#define MAXN 1005
int g[MAXN];
int fib[20],fib_cnt;
bool vis[MAXN];
int main()
{
int m,n,p;
int a=1,b=1;
while(a<MAXN)
{
fib[fib_cnt++]=a;
b=a+b;
swap(a,b);
}
g[0]=0;
for(int i=1,j;i<MAXN;i++)
{
memset(vis,0,sizeof vis);
for(j=0;j<fib_cnt&&fib[j]<=i;j++)
vis[g[i-fib[j]]]=1;
for(j=0;vis[j];j++);
g[i]=j;
}
while(1)
{
scanf("%d%d%d",&m,&n,&p);
if(!m&&!n&&!p)break;
if(((g[m]^g
)^g[p])==0)
printf("Nacci\n");
else
printf("Fibo\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: