HDU 1848[Fibonacci again and again] 题解

来源:互联网 发布:幽浮2知乎 编辑:程序博客网 时间:2024/06/10 23:11

由于今天考试一道题都没有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