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

你可能感兴趣的:(HDU)