算法競賽模板 矩陣快速冪


設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];//視公式而定 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM