矩阵加速优化线性递推

首先来看一下定义:

 

看不懂?那么用循环思想来解释一下;

首先你要知道,只有在第一个矩阵的列数和第二个矩阵的行数相同时乘法才有意义。

那么,对于答案C在(i,j)上的元素,可以理解为A的第i行和B的第j列上的乘积和~;

所以在进行矩阵加速的时候,可以通过枚举i,j,k来进行计算;

下面以著名的斐波那契数列来进行代码的实现:

#include <bits/stdc++.h>
#define p 1000000007
using namespace std;
long long st[10][10];
long long tmp[10][10];
long long a[10][10];
void cheng1()
{
    memset(tmp,0,sizeof(tmp));
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            tmp[1][i]+=(st[1][j]*a[j][i])%p;
            tmp[i][j]%p;
        }
    }
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            st[i][j]=tmp[i][j];
        }
    }
}
void cheng2()
{
    memset(tmp,0,sizeof(tmp));
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            for(int k=1;k<=2;k++){
                tmp[i][j]+=(a[k][j]*a[i][k])%p;
                tmp[i][j]%=p;
            }
        }
    }
    for(int i=1;i<=2;i++){
        for(int j=1;j<=2;j++){
            a[i][j]=tmp[i][j];
        }
    }
}
void JZKSM(long long n)
{
    while(n){
        if(n&1) cheng1();
        cheng2();
        n/=2;
    }
}
int main()
{
    long long n;
    cin>>n;
    a[1][1]=1,a[1][2]=1,a[2][1]=1;
    st[1][1]=1,st[1][2]=1;
    JZKSM(n-2);
    if(n==1||n==2){
        cout<<"1";
        return 0;
    }
    cout<<st[1][1]%p;
}

猜你喜欢

转载自www.cnblogs.com/kamimxr/p/11498317.html
今日推荐