首页 > 编程语言 >一些些数学的算法笔记

一些些数学的算法笔记

时间:2024-02-02 19:33:06浏览次数:412  
标签:int 矩阵 cdots 笔记 times 算法 数学 long 乘法

好好好,直接进入正题(


首先我们先要讲讲矩阵,矩阵你可以理解成 \(n\times m\) 的一个二维数组,我们如下表示它:

\[\begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,m} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,m} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n,1} & a_{n,2} & \cdots & a_{n,m} \end{bmatrix} \]

矩阵最重要的一个运算就是矩阵乘法,矩阵乘法就是给定一个 \(n\times m\) 的矩阵 \(A\),和一个 \(m\times l\) 的矩阵 \(B\),得到一个 \(n\times l\) 的矩阵 \(C\),而 \(C\) 的每一位 \(c_{i,j}=\sum_{k=1}^ma_{i,k}\times b_{k,j}\)。简单来说就是 \(c_{i,j}\) 等于 \(A\) 矩阵的第 \(i\) 行,与 \(B\) 矩阵的第 \(j\) 列的元素顺序分别相乘再相加得到的数。


矩阵我们一般会把他封装到一个结构体里,接下来看看一道题吧。

LG-P3390 【模板】矩阵快速幂

给定 \(n\times n\) 的矩阵 \(A\),求 \(A^k\)。

首先我们要声明一件事,矩阵乘法满足结合律,但不满足交换律。前者可以直接爆算得出,后者可以举例得出。我们知道任何满足结合律的运算都可以用快速幂求解,所以我们只要写出矩阵乘法的代码和快速幂的代码即可。

#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 105, kM = 1e9 + 7;

int n;
long long k;

struct M { // 矩阵结构体
  int n, m;
  long long a[kMaxN][kMaxN];
  M(int h, int w) { n = h, m = w, memset(a, 0, sizeof(a)); }
  M() { memset(a, 0, sizeof(a)); } // 这两个都是初始化矩阵
  M operator*(M b) { // 重载乘法运算符,实现矩阵乘法
    M r(n, b.m);
    for (int k = 1; k <= m; k++) {
      for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= b.m; j++) {
          r.a[i][j] = (r.a[i][j] + a[i][k] * b.a[k][j]) % kM;
        }
      }
    }
    return r;
  }
} A;

M fpow(M A, long long b) { // 矩阵快速幂
  M r(n, n);
  for (int i = 1; i <= r.n; i++) {
    r.a[i][i] = 1;
  }
  for (; b; b >>= 1, A = A * A) {
    if (b & 1) r = r * A;
  }
  return r;
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> k, A = M(n, n);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cin >> A.a[i][j];
    }
  }
  A = fpow(A, k);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) {
      cout << A.a[i][j] << ' ';
    }
    cout << '\n';
  }
  return 0;
}

介绍完矩阵乘法,你们是不是就要问:“这有什么用呢?”其实这个东西的用处很大,下面再讲一道题。

LG-P1962 斐波那契数列

标签:int,矩阵,cdots,笔记,times,算法,数学,long,乘法
From: https://www.cnblogs.com/lrx-blogs/p/18002279

相关文章

  • SpringBoot 多模块开发 笔记(一)
    多模块开发简易版dao层也可以说是Mapper层web层将controller放在这一层还有统一返回类型和自定义异常也在放在这里启动类也放在这里model层也就是数据对象比如常见的User类server层业务逻辑层或者说service层更好创建步骤创建一个正常的Spr......
  • 代码随想录算法训练营第十天| 堆栈理论基础 232.用栈实现队列 225. 用队列实现栈
    堆栈理论基础 代码随想录(programmercarl.com)STL中栈往往不被归类为容器,而被归类为containeradapter(容器适配器)。栈的内部结构,栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现。我们常用的SGISTL,如果没有指定底层实现的话,默认是以deque为缺......
  • STM32MP135开发板助力电力行业,IEC61850协议移植笔记
    1.概述IEC61850是变电站自动化系统(SAS)中通信系统和分散能源(DER)管理的国际标准。它通过标准的实现,实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明,在电力和储能系统中应用非常广泛。本文基于米尔MYD-YF13X开发板,在Linux系统上移植和使用开源的l......
  • STM32MP135开发板助力电力行业,IEC61850协议移植笔记
    1.概述IEC61850是变电站自动化系统(SAS)中通信系统和分散能源(DER)管理的国际标准。它通过标准的实现,实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明,在电力和储能系统中应用非常广泛。本文基于米尔MYD-YF13X开发板,在Linux系统上移植和使用开源的libI......
  • HTTP学习笔记
    教程:geektime透视HTTP协议【此教程时间:2019年】※,01、HTTP的前世今生HTTP协议始于三十年前蒂姆·伯纳斯-李的一篇论文(1989年)http/0.9:20世纪90年代初期的互联网世界非常简陋,计算机处理能力低,这一时期的HTTP被定义为0.9版,结构比较简单,为了便于服务器和客户端处理,它也......
  • 步进电机梯形加减速(Trapezoid)及S型加减速(S-Curve)算法理论与实现
    摘要本文讲述了步进电机梯形加减速及S型加减速的算法实现。抛砖引玉。说明原稿件是Work里面有很多公式和图片,改成MarkDown格式太费劲了。直接提供gitee的下载链接,里面有源码和算法文档。贴几张算法文档里的图片给大家看看吧:图:Python实现T型加减速算法,运行截图图......
  • Python学习笔记05
    3.4String(字符串)字符串特点:用单引号'或双引号"括起来,同时使用反斜杠\转义特殊字符。取字符串中的值:语法格式——变量[头下标:尾下标],左闭右开字符串索引值:Coding从前面索引012345从后面索引-6-5-4-3-2-1字符串输出示例代码str='Coding......
  • Python学习笔记04
    3.3运算符(以下假设变量a=10,变量b=21)【算数运算符】:运算符描述实例+加,两个对象相加a+b输出结果31-减,得到负数或是一个数减去另一个数a-b输出结果-11*乘,两个数相乘或是返回一个被重复若干次的字符串a*b输出结果210/除,x除......
  • Python学习笔记02
    二、基础语法2.1注释单行注释:#多行注释:'''或"""示例输入:#第一个注释#第二个注释'''第三注释第四注释'''"""第五注释第六注释"""print("Hello,World!")输出:Hello,World!2.2行与缩进pyt......
  • Python学习笔记03
    3.2Number(数字)三种数值类型实例:整型(int)浮点型(float)复数(complex)100.03+4j10015.2045.j-786-21.93e+26J080-90.4.53e-7j-049032.3e+183.14j-0x26070.2E-12a+bj↑0x表示16进制↑e和E为科学计数法↑a,b均为浮点型数字类型转......