首页 > 其他 > 详细

矩阵加速优化线性递推

时间:2019-09-10 17:02:01      阅读:94      评论:0      收藏:0      [点我收藏+]

首先来看一下定义:

技术分享图片

技术分享图片

技术分享图片

技术分享图片

 

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

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

那么,对于答案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;
}

 

矩阵加速优化线性递推

原文:https://www.cnblogs.com/kamimxr/p/11498317.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!