zoukankan      html  css  js  c++  java
  • 矩阵加速优化线性递推

    首先来看一下定义:

     

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

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

    那么,对于答案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;
    }
  • 相关阅读:
    Kibana 基本操作
    kibana安装
    es7.2版本安装ik分词
    Elastic Search闪退问题
    Elastic Search安装-windows
    1-ES简单介绍
    vue项目1-pizza点餐系统12-设计购物车
    vue项目1-pizza点餐系统11-设计menu页面
    前端:table、thead、th、tr、td
    某二分图匹配题的题解
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11498317.html
Copyright © 2011-2022 走看看