题目大意:有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[n])^g[p])==0)
printf("Nacci\n");
else
printf("Fibo\n");
}
return 0;
}

本文介绍了一个基于Fibonacci数列的取石游戏问题,并使用SG定理进行解答。通过预处理Fibonacci数列并计算每个状态的SG值,实现了判断先手玩家胜负情况的算法。
&spm=1001.2101.3001.5002&articleId=54973240&d=1&t=3&u=e5d6e3574ac24b89b3e6ebad2f3cf0e4)
4368

被折叠的 条评论
为什么被折叠?



