首页 > 其他分享 >矩阵加速递推

矩阵加速递推

时间:2023-05-06 20:44:50浏览次数:42  
标签:begin end matrix int 矩阵 vector bmatrix 递推 加速

首先矩阵快速幂模板

struct matrix {
    static constexpr int mod = 1e9 + 7;
    int x, y;
    vector<vector<int>> v;

    matrix() {}

    matrix(int x, int y) : x(x), y(y) {
        v = vector<vector<int>>(x + 1, vector<int>(y + 1, 0));
    }

    void I() {// 单位化
        y = x;
        v = vector<vector<int>>(x + 1, vector<int>(x + 1, 0));
        for (int i = 1; i <= x; i++) v[i][i] = 1;
        return;
    }

    void display() { // 打印
        for (int i = 1; i <= x; i++)
            for (int j = 1; j <= y; j++)
                cout << v[i][j] << " \n"[j == y];
        return;
    }

    friend matrix operator*(const matrix &a, const matrix &b) { //乘法
        assert(a.y == b.x);
        matrix ans(a.x, b.y);
        for (int i = 1; i <= a.x; i++)
            for (int j = 1; j <= b.y; j++)
                for (int k = 1; k <= a.y; k++)
                    ans.v[i][j] = (ans.v[i][j] + a.v[i][k] * b.v[k][j]) % mod;
        return ans;
    }

    friend matrix operator^( matrix x , int y ){ // 快速幂
        assert( x.x == x.y );
        matrix ans(x.x , x.y);
        ans.I();//注意一定要先单位化
        while( y ){
            if( y&1 ) ans = ans*x;
            x = x * x , y >>= 1;
        }
        return ans;
    }
};

例题Luogo P1939

已知数列\(a\),满足

\[a_i=\left\{\begin{matrix} 1 & i\in \{1,2,3\}\\ a_{i-1}+a_{x-3}& x\ge 4 \end{matrix}\right. \]

求数列第\(n\)项对\(10^9+7\)取模

设计状态阵\(mat_i=\begin{bmatrix} a_i \\ a_{i-1}\\ a_{i-2} \end{bmatrix}\),则\(mat_{i+1}=\begin{bmatrix}a_{i+1}\\a_{i}\\a_{i-1}\end{bmatrix}=\begin{bmatrix}a_{i}+a_{i-2}\\a_{i}\\a_{i-1}\end{bmatrix}\)

可以用待定系数法,加对应项相等解出转移矩阵\(\begin{bmatrix}1&0&1\\1&0&0\\0&1&0\end{bmatrix}\)

则\(mat_{3+n}=\begin{bmatrix}1&0&1\\1&0&0\\0&1&0\end{bmatrix}^n\times mat_3\)

标签:begin,end,matrix,int,矩阵,vector,bmatrix,递推,加速
From: https://www.cnblogs.com/PHarr/p/17378413.html

相关文章

  • 矩阵学习笔记
    定义我们把一个\(n\timesm\)的数列叫做矩阵。他可以解决一部分线性递推的题目。特别的,我们常说的向量就是一个\(1\timesn\)的矩阵捏。单位元我们形如这样\(\begin{bmatrix}1&0&0\\0&1&0\\0&0&1\end{bmatrix}\)这种只有对角线都是\(1\)的叫做单位元。运算主......
  • 加速 AI 训练,如何在云上实现灵活的弹性吞吐
    AI已经成为各行各业软件研发的基础,带来了前所未有的效率和创新。今天,我们将分享苏锐在AWS量化投研行业活动的演讲实录,为大家介绍JuiceFS在AI量化投研领域的应用经验,也希望为其他正在云上构建机器学习平台,面临热点数据吞吐不足的企业提供一些启发。1.背景JuiceFS最初是为了......
  • (DFS + 剪枝)剑指 Offer 12. 矩阵中的路径
    题目描述:给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用......
  • LeetCode 59. 螺旋矩阵 II
    题目链接:LeetCode59.螺旋矩阵II本题不涉及算法,只是简单的模拟,但是由于边界条件比较多,因此容易出错。分析题干:题目要求按照右、下、左、上、这样的顺序对数组进行填充,填充的值为1~n*n,因此问题的关键就是找到待填充的位置,将其值赋值为i即可。由于填充的顺序是有规律的,因......
  • AcWing 754. 平方矩阵 II
    AcWing754.平方矩阵II1.地址https://www.acwing.com/problem/content/756/2.题解#include<iostream>#include<cstdio>#include<cmath>usingnamespacestd;//每个元素的值为:各个元素下标相减的绝对值+1intmain(){intmatrix[102][102];intn;......
  • 矩阵基础知识
    文章目录1.矩阵的一些基础知识1.1矩阵只有乘法1.2向量有点乘(也是内积)和叉乘:1.3单位向量1.4正交矩阵1.5线性无关和线性相关的向量1.6矩阵的逆1.7对称矩阵1.7矩阵的秩(rank)1.8伴随矩阵1.9矩阵的零空间1.10矩阵的扩展基定理1.矩阵的一些基础知识1.1矩阵只有乘法1.2向量......
  • sklearn.metrics.confusion_matrix—计算混淆矩阵来评估分类的准确性
    在分类模型的性能评估指标总结中,已讲过混淆矩阵形式,接下来将介绍如何通过sklearn库中的confusion_matrix函数快速获得混淆矩阵。语法格式sklearn.metrics.confusion_matrix(y_true, y_pred, *, labels=None, sample_weight=None, normalize=None)参数解释:y_true:真实标......
  • 矩阵の集合
    1.基本运算$\color{#000000}{P3390}$$\color{#FFB90F}{模板:矩阵乘法}$$\color{#000000}{P1939}$$\color{#FFB90F}{模板:矩阵加速}$$\color{#000000}{P1962}$$\color{#7CCD7C}{斐波那契数列}$$\color{#000000}{P4723}$$\color{#555555}{常系数......
  • 2023/05/03(矩阵+高斯+线性基)
    (点击黑色题号进入题目~~)1.矩阵$\color{#000000}{P4723}$$\color{#555555}{多项式}$->$\color{#000000}{P1939}$$\color{#FFB90F}{矩阵加速}$$\color{#000000}{CF575A}$$\color{#B23AEE}{Fibonotci}$$\color{#000000}{P2579}$$\color{#6495ED}{......
  • 学习笔记:矩阵快速幂
    1.矩阵乘法设矩阵有\(H\)行,\(L\)列,则两个矩阵\(MatA,MatB\)进行乘法,需要满足\(MatA.L=MatB.H\)。则结果矩阵\(MatR_{i,j}=\sum\limits^{n}_{z=1}MatA_{i,z}*MatB_{z,j}\)。性质:结合律,但不满足交换律。matoperator*(mata,matb){ matc; memset(c.mat,0,sizeof(c.......