HDU 1848 Fibonacci again and again

来源:互联网 发布:java中属性是什么意思 编辑:程序博客网 时间:2024/05/19 12:17


一个简单的博弈题吧!!把SG函数的表打出来,再把3堆分开异或,就行了。

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;int q[1008],w[1008],sg[1008];void Fibonacci(){    w[1]=1;    w[2]=2;    for(int i=3;;i++){        w[i]=w[i-1]+w[i-2];        if(w[i]>1010) break;    }}int main(){    Fibonacci();    int i,j,a,b,c,sum;    sg[0]=0;    for(i=1;i<=1001;i++){        memset(q,0,sizeof(q));        for(j=1;w[j] <= i;j++) q[sg[i-w[j]]] =1;        for(j=0;;j++)        {            if(!q[j]){                sg[i]=j;break;            }        }    }        while(~scanf("%d%d%d",&a,&b,&c)){        if(a==0 && b== 0 && c== 0) break;        sum=sg[a]^sg[b]^sg[c];        if(sum ) printf("Fibo\n");        else printf("Nacci\n");    }    return 0;}

不过自己觉得不用标准的SG函数,也靠打表也可以求出,不过写出来答案是错误的,不知道原因所在,求解。。。。  代码下:

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;int q[1008],w[1008],sg[1008];void Fibonacci(){    w[1]=1;    w[2]=2;    for(int i=3;;i++){        w[i]=w[i-1]+w[i-2];        if(w[i]>1010) break;    }}int main(){    Fibonacci();    int i,j,a,b,c,sum;        memset(sg,0,sizeof(sg));    for(i=1;i<=1008;i++){        j=1;        while(w[j] <= i){            if(sg[i-w[j]] == 0){                sg[i]=1; break;            }            j++;        }    }    /*for(i=1;i<=100;i++) printf("%d ",q[i]);    printf("\n");*/    while(~scanf("%d%d%d",&a,&b,&c)){        if(a==0 && b== 0 && c== 0) break;        sum=sg[a]^sg[b]^sg[c];        if(sum ) printf("Fibo\n");        else printf("Nacci\n");    }    return 0;}

坚持....

0 0
原创粉丝点击