算法竞赛模板 矩阵快速幂

设A为  的矩阵,B为  的矩阵,那么称  的矩阵C为矩阵A与B的乘积,记作  ,其中矩阵C中的第 行第 列元素可以表示为:

如下所示:
 
当矩阵A的列数等于矩阵B的行数时,A与B可以相乘
(1) 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
(2) 乘积C的第 行第 列的元素等于矩阵A的第 行的元素与矩阵B的第 列对应元素乘积之和。
 

矩阵快速幂的模板:

就是要找到一个矩阵A,满足 F[i-1]*A=F[i]
然后就通过矩阵的性质,计算出 F[n]=A^(n-1)*F[1]

#define mod 10000
#define N 2
struct mat
{
    int m[N+1][N+1];
    mat()
    {
        m[1][1]=1;m[1][2]=1;
        m[2][1]=1;m[2][2]=0;
    }
};
mat mul(mat a,mat b)
{
    mat ans;
    int i,j,k;
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            ans.m[i][j]=0;
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            for(k=1;k<=N;k++)
                ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
    return ans;
}
int matqp(int p)
{
    mat ans,t;
    int i,j;
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            if(i==j)ans.m[i][j]=1;
            else ans.m[i][j]=0;
    while(p)
    {
        if(p&1)
            ans=mul(ans,t);
        t=mul(t,t);
        p=p>>1;
    }
    return ans.m[2][1];//视公式而定 
}

 

posted @ 2018-08-22 16:24  真想不出名字了  阅读(2203)  评论(0编辑  收藏  举报