矩阵poj 3070

时间紧张,先记一笔,后续优化与完善。

    矩阵减速

    

    

    #include <iostream>

    #include <cstdio>

    #include <cstring>

    using namespace std;

    int c[101][3][3],b[3][3],d[3][3],lon;

    int n;

    void dfs(int k)

    {

    if(k==1)

    {

        lon++;

        for(int i=1;i<=2;i++)

        for(int j=1;j<=2;j++)

        c[lon][i][j]=b[i][j];

        return;

    }

    dfs(k/2);

    memset(d,0,sizeof(d));

    for(int p=1;p<=2;p++)

    for(int q=1;q<=2;q++)

    for(int i=1;i<=2;i++)

    {

        d[p][q]+=c[lon][p][i]*c[lon][i][q];

        d[p][q]%=10000;

    }

    lon++;

    if(k&1)

    {

        for(int p=1;p<=2;p++)

        for(int q=1;q<=2;q++)

        for(int i=1;i<=2;i++)

        {

    每日一道理
水仙亭亭玉立,兰花典雅幽香,牡丹雍容华贵,梨花洁白无暇……美丽的花朵总能得到世人的羡慕与赞叹,殊不知,它从一粒小小的种子到最后开花,要历经无数的艰辛与坎坷!我们的成长也是如此。只有做辛勤的“织梦者”,我们的梦想才会成真!

            c[lon][p][q]+=d[p][i]*b[i][q];

            c[lon][p][q]%=10000;

        }

    }

    else

    {

        for(int p=1;p<=2;p++)

        for(int q=1;q<=2;q++)

        c[lon][p][q]=d[p][q];

    }

    }

    int main()

    {

    while(scanf("%d",&n),n!=-1)

    {

        if(n<=2)

        {

            if(n==0) printf("0\n");

            else if(n==1) printf("1\n");

            else printf("2\n");

            continue;

        }

        b[1][1]=1;

        b[1][2]=1;

        b[2][1]=1;

        b[2][2]=0;

        memset(c,0,sizeof(c));

        lon=-1;

        dfs(n-2);

        int ans=(c[lon][1][1]+c[lon][2][1])%10000;

        printf("%d\n",ans);

    }

    return 0;

    }

文章结束给大家分享下程序员的一些笑话语录: 祝大家在以后的日子里. 男生象Oracle般健壮; 女生象win7般漂亮; 桃花运象IE中毒般频繁; 钱包如Gmail容量般壮大, 升职速度赶上微软打补丁 , 追女朋友像木马一样猖獗, 生活像重装电脑后一样幸福, 写程序敲代码和聊天一样有**。

posted @ 2013-04-23 19:46  xinyuyuanm  阅读(146)  评论(0编辑  收藏  举报