Luogu P2144 [FJOI2007]轮状病毒

Luogu P2144 [FJOI2007]轮状病毒

第一遍看完生涩的题目,发现:肯定是数论
数论。。。不可以一看就怂 应该看第二遍再怂
开始在画图中愉快的模拟,然后我发现我画出的图形又丑又无法保证正确性。。。
感到自己很傻并停止了这样的行为。。。
%一篇很棒的题解
根据其中推荐,发现了一个很有趣很有用的网站
我和lhy不停按more并且笑了好一会。。。
开始认真看题解,基尔霍夫矩阵及后面都看不懂。。。

于是愉快的选择了
a[i]=a[i-1]*3-a[i-2]+2
然后开始打高精度模拟。。

高精减打错了一个细节还一直没看出来耗了好久。。

#include<cstdio>
#include<cstring>

struct nod1{int a[100100],l;}x[110];
int n;

void chen(int xx)
{
    for(int i=1;i<=x[xx].l;i++)
    {
        x[xx].a[i]=x[xx].a[i]*3;
    } 
    for(int i=1;i<=x[xx].l;i++)
    {
        if(x[xx].a[i]>9)
        {
            x[xx].a[i+1]+=x[xx].a[i]/10;
            x[xx].a[i]%=10;
            if(i+1>x[xx].l)x[xx].l++;
        }
    } 
    while(x[xx].l>1&&x[xx].a[x[xx].l]==0)x[xx].l--;
    //return z;
}

int jian(int xx,int yy)
{
    //nod1 z;
    //z.l=xx.l;
    for(int i=1;i<=x[xx].l;i++)
    {
        x[xx].a[i]=x[xx].a[i]-x[yy].a[i];
    } 

    for(int i=1;i<=x[xx].l;i++)
    {
        if(x[xx].a[i]<0)
        {
            x[xx].a[i+1]-=1;
            x[xx].a[i]+=10;
            //if(i+1>z.l)z.l++;
            //if(x[xx].a[i+1]==0)x[xx].l--;
        }
    } 
    while(x[xx].l>1&&x[xx].a[x[xx].l]==0)x[xx].l--;


}

nod1 work(int xx,int yy,int z)
{
    x[z].l=x[xx].l;
    for(int i=1;i<=x[xx].l;i++)
    {
        x[z].a[i]=x[xx].a[i];
    }

    /*for(int i=x[z].l;i>=1;i--)
    {
        printf("%d",x[z].a[i]);
    }
    printf(" %d 1\n",x[z].l);*/

    chen(z);

    /*for(int i=x[z].l;i>=1;i--)
    {
        printf("%d",x[z].a[i]);
    }
    printf(" %d 2\n",x[z].l);*/

    jian(z,yy);

    x[z].a[1]+=2;

    /*for(int i=x[z].l;i>=1;i--)
    {
        printf("%d",x[z].a[i]);
    }
    printf("\n");*/

    for(int i=1;i<=x[z].l;i++)
    {
        if(x[z].a[i]>9)
        {
            x[z].a[i+1]+=x[z].a[i]/10;
            x[z].a[i]%=10;
            if(i+1>x[z].l)x[z].l++;
        }
    } 
    while(x[z].l>1&&x[z].a[x[z].l]==0)x[z].l--;
}


int main()
{

    //while(1)
    //{
        scanf("%d",&n);
        //for(int i=1;i<=n;i++)
        //{
        //  x[i].l=0;
        //}
        x[1].a[1]=1;
        x[2].a[1]=5;
        x[1].l=1;
        x[2].l=1;
        for(int i=3;i<=n;i++)
        {//printf("11111111");
            work(i-1,i-2,i);
        }//printf("1111");
        /*for(int k=1;k<=15;k++)
        {*/
            for(int i=x[n].l;i>=1;i--)
            {
                printf("%d",x[n].a[i]);
            }//printf(" %d\n",x[k].l);
        //}

    //}

}

注释掉的代码都是调试的曲折,看来高精度还没有熟练掌握啊。。。

猜你喜欢

转载自blog.csdn.net/qq_42142540/article/details/80300479