X-man

导航

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

posted on 2013-05-23 21:05  雨钝风轻  阅读(172)  评论(0编辑  收藏  举报