• hdu 2855


    题解:

               知识储备:1.(1+x)^n=

                             2.斐波那契数列可以用矩阵来表示:mat={1,1,1,0},| 1  1|对应   | f(x+2)  f(x+1)|

                             x可以换为mat,而1就是单位矩阵;                             | 1  0|         | f(x+1)   f(x)   |

    #include<stdio.h>
    int n,ma;
    struct Matrix
    {
        int m[2][2];
    };
    Matrix mat,unit;
    void Initiate()
    {
        mat.m[0][0]=2;//(1+x)的矩阵运算
        mat.m[0][1]=1;
        mat.m[1][0]=1;
        mat.m[1][1]=1;
        unit.m[0][0]=unit.m[1][1]=1;
        unit.m[0][1]=unit.m[1][0]=0;
    }
    Matrix mul(Matrix &a,Matrix &b)
    {
        Matrix c;
        for(int i=0;i<2;i++)
        for(int j=0;j<2;j++)
        {
            c.m[i][j]=0;
            for(int k=0;k<2;k++)
            {
                c.m[i][j]+=a.m[i][k]*b.m[k][j];
                c.m[i][j]%=ma;
            }
        }
        return c;
    }
    Matrix Pow(int n)
    {
        Matrix p=unit,base=mat;
        while(n)
        {
            if(n&1)
            p=mul(p,base);
            n>>=1;
            base=mul(base,base);
        }
        return p;
    }
    int main()
    {
        int _case;
        Initiate();
        scanf("%d",&_case);
        while(_case--)
        {
            scanf("%d %d",&n,&ma);
            Matrix ans=Pow(n);
            printf("%d\n",ans.m[0][1]);//or ans.m[1][0];
        }
        return 0;
    }

    代码风格来自队友hjh:http://www.cnblogs.com/wally/archive/2013/03/06/2945400.html

  • 相关阅读:
    二分图最大匹配的K&#246;nig定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3095647.html
Copyright © 2020-2023  润新知