首页 > 编程语言 >【算法原理】矩阵乘法

【算法原理】矩阵乘法

时间:2023-01-09 17:36:09浏览次数:61  
标签:f1 int 矩阵 ++ 算法 mul 乘法

【算法原理】矩阵乘法

一般是矩阵乘法 + 快速幂,结合 \(dp\)

普通矩阵乘法:

矩阵乘法有结合律,无交换律。
因此在计算一长串矩阵相乘的时候,可以依据计算难度选择计算顺序,从而优化计算时间。

板子

例题

1304. 佳佳的斐波那契

https://www.acwing.com/problem/content/1306/
经典 \(Fibonacci\) 求和优化。

关键在于构造一个只有常量的系数矩阵 \(A\),然后利用结合律优化计算矩阵乘的过程。

如下图,系数存在变量,所以要做一些变换:

有点高中数学那味了。
因此要维护的信息就是:

die码:

#include <bits/stdc++.h>
#define ll long long

using namespace std;
const int N = 4;
int n, m;

void mul(int c[][N], int a[][N], int b[][N])  {// c = a * b
    static int t[N][N];
    memset(t, 0, sizeof t);

    for (int i = 0; i < N; i ++ ) {
        for (int j = 0; j < N; j ++ ) {
            for (int k = 0; k < N; k ++ ) {
                t[i][j] = (t[i][j] + (ll)a[i][k] * b[k][j]) % m;
            }
        }
    }
    memcpy(c, t, sizeof t);
}

int main() {
    cin >> n >> m;
    // {fn, fn+1, sn, pn}
    // pn = n * sn - tn
    int f1[N][N] = {1, 1, 1, 0};
    int a[N][N] = {
        {0, 1, 0, 0},
        {1, 1, 1, 0},
        {0, 0, 1, 1},
        {0, 0, 0, 1},
    };

    int k = n - 1;
    // 快速幂
    while (k) {
        if (k & 1) mul(f1, f1, a);  // f1 = f1 * a
        mul(a, a, a);  // a = a * a
        k >>= 1;
    }
    cout << (((ll)n * f1[0][2] - f1[0][3]) % m + m) % m << endl;
}


//1:00:00

Ref

\(AcWing\) 提高课

维基百科

从零开始的矩阵乘法

矩阵加速图上问题学习笔记

标签:f1,int,矩阵,++,算法,mul,乘法
From: https://www.cnblogs.com/CTing/p/17037430.html

相关文章

  • Miller-Rabin算法学习笔记
    个人不是很理解Miller-Rabin算法的正确性,所以这篇东西可以图一乐(确定性判素性的方法都很慢,所以要考虑随机但是错误概率低的判素方法。首先有Fermat素性测试,即费马小定理......
  • 线性表算法相关练习
    //将两个递增的有序链表合并为一个递增的有序链表。//要求结果链表仍使用原来两个链表的存储空间,不另外占用其他的存储空间。表中不允许有重复的数据。#include<iostream>#......
  • 算法题基础知识汇总
     子串长度字符串python字符串的while()循环遍历​​http://www.cocoachina.com/articles/895083​​c-如何在std::vector中存储固定长度的字符串​​http://www.myexcep......
  • 每日算法之14. 最长公共前缀
    14.最长公共前缀题目描述编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。方法暴力算法先判断字符串数组是否有为空,为空直接......
  • Model-Agnostic Meta-Learning (MAML)模型介绍及算法详解
    paper:​​​https://link.zhihu.com/?target=https%3A//arxiv.org/pdf/1703.03400.pdf​​ MAML在学术界已经是非常重要的模型了,论文Model-AgnosticMeta-LearningforFa......
  • 算法--2023.1.9
    1.力扣128-最长连续序列classSolution{publicintlongestConsecutive(int[]nums){//通过hashset保存去重复后的所有数据intn=nums.lengt......
  • 贪心算法
    一、贪心算法思想1)贪心算法原理贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局......
  • 详解 Kruskal 最小生成树算法
     求最小生成树算一般有两种算法:Prim和Kruskal。Prim的时间复杂度为\(O(|V|^{2})\),更适合稠密图。而Kruskal的时间复杂度为\(O(logV)\)或\(O(logE)\)。更适......
  • ACM&OI 多项式算法专题
    ACM&OI基础数学算法专题一、FFT基础拉格朗日插值复数的运算性质和几何性质单位根和单位根反演快速傅里叶变换(FFT)的分治实现快速傅里叶逆变换(IFFT)快速傅里叶变换的......
  • 退火算法学习笔记
    初创建于2022-02-0900:29前段时间学习了一下退火算法。这里简单记一下踩过的坑~退火算法是一种搜索算法,我认为其核心思想便是”以一定的概率接受一个更差的解“,这样可......