由于今天考试一道题都没有AC,所以写这道题来增加自信。水博客,可以考虑不看。
题目大意
依旧是Nim游戏,不过取得石子个数要求是斐波那契数列中的数字
解题分析
就是纯SG函数裸题,SG函数可以预先求,然后后面O(1)判断就行了。反正只是水博客的。
#include<cstdio>
#include<cstring>
using namespace std;
int x,y,z,f[1005],sg[1005];
bool vs[1005];
void _work()
{
sg[0]=0; f[0]=f[1]=1;
for (int i=2;f[i-1]<=1000;i++) f[i]=f[i-1]+f[i-2];
for (int i=1;i<=1000;i++){
memset(vs,0,sizeof(vs));
for (int j=1;f[j]<=i;j++) vs[sg[i-f[j]]]=true;
for (int j=0;j<=1000;j++) if (!vs[j]) {sg[i]=j; break;}
}
}
inline void readi(int &x){
x=0; char ch=getchar();
while ('0'>ch||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
}
int main()
{
freopen("fibonacci.in","r",stdin);
freopen("fibonacci.out","w",stdout);
_work();
readi(x); readi(y); readi(z);
while (x!=0||y!=0||z!=0){
if (sg[x]^sg[y]^sg[z]) printf("Fibo\n"); else printf("Nacci\n");
readi(x); readi(y); readi(z);
}
return 0;
}
Orz 今天考试考了高分的Matchperson