矩阵快速幂

矩阵快速幂

矩阵:

一个矩阵 A A A,是由 n × m n\times m n×m 个数字组成, B B B m × p m\times p m×p 组成,详见下。
A = [ a 1 , 1 , a 1 , 2 , a 1 , 3 ⋯ a 1 , m a 2 , 1 , a 2 , 2 , a 2 , 3 ⋯ a 2 , m ⋅ ⋅ ⋅ a n , 1 , a n , 2 , a n , 3 ⋯ a n , m ] B = [ b 1 , 1 , b 1 , 2 , b 1 , 3 ⋯ b 1 , p b 2 , 1 , b 2 , 2 , b 2 , 3 ⋯ b 2 , p ⋅ ⋅ ⋅ b m , 1 , b m , 2 , b m , 3 ⋯ b m , p ] A=\begin{bmatrix}a_{1,1},a_{1,2},a_{1,3}\cdots a_{1,m} \\ a_{2,1},a_{2,2},a_{2,3}\cdots a_{2,m} \\ \cdot \\ \cdot \\ \cdot \\ a_{n,1},a_{n,2},a_{n,3}\cdots a_{n,m}\end{bmatrix} \\ \\ B=\begin{bmatrix}b_{1,1},b_{1,2},b_{1,3}\cdots b_{1,p} \\ b_{2,1},b_{2,2},b_{2,3}\cdots b_{2,p} \\ \cdot \\ \cdot \\ \cdot \\ b_{m,1},b_{m,2},b_{m,3}\cdots b_{m,p} \end{bmatrix} A= a1,1,a1,2,a1,3a1,ma2,1,a2,2,a2,3a2,man,1,an,2,an,3an,m B= b1,1,b1,2,b1,3b1,pb2,1,b2,2,b2,3b2,pbm,1,bm,2,bm,3bm,p
注意到, A A A 的列数与 B B B 的行数均为 m m m,将其定义为可以进行矩阵乘法的两个矩阵

如何相乘?

若其乘积为矩阵 C C C,则 C C C 为一个 n × p n\times p n×p 的矩阵,乘积过程为:
c i , j = ∑ k = 1 m a i , k × b k , j c_{i,j}=\sum_{k=1}^{m} a_{i,k}\times b_{k,j} ci,j=k=1mai,k×bk,j
代码:

for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)c[i][j]+=a[i][k]*b[k][j];

这不就是Floyd吗。。

A A A 描述成 n n n 个行向量的集合, B B B 表示为 p p p 个列向量的集合,如下。
A = [ a 1 a 2 a 3 ⋅ ⋅ ⋅ a n ] B = [ b 1 , b 2 , b 3 ⋯ b p ] A=\begin{bmatrix} a_1 \\ a_2 \\ a_3 \\ \cdot \\ \cdot \\ \cdot \\ a_n \end{bmatrix} \\ \\ \\ B=\begin{bmatrix} b_1,b_2,b_3 \cdots b_p \end{bmatrix} A= a1a2a3an B=[b1,b2,b3bp]
C C C 为:
C = [ a 1 × b 1 , a 1 × b 2 , a 1 × b 3 ⋯ a 1 × b p a 2 × b 1 , a 2 × b 2 , a 2 × b 3 , ⋯ a 2 × b p ⋅ ⋅ ⋅ a n × b 1 , a n × b 2 , a n × b 3 ⋯ a n × b p ] C=\begin{bmatrix}a_1\times b_1\ ,\ a_1\times b_2\ ,\ a_1\times b_3\cdots a_1\times b_p \\ a_2\times b_1\ ,\ a_2\times b_2\ ,\ a_2\times b_3\ ,\cdots a_2\times b_p \\ \cdot \\ \cdot \\ \cdot \\ a_n\times b_1\ ,\ a_n\times b_2\ ,\ a_n\times b_3\cdots a_n\times b_p \end{bmatrix} C= a1×b1 , a1×b2 , a1×b3a1×bpa2×b1 , a2×b2 , a2×b3 ,a2×bpan×b1 , an×b2 , an×b3an×bp

上文提到,若 A A A B B B 有一个 m m m 相等,则它们有一个单位元,可以使其相乘后不影响结果。

更清楚的具体方法如下,可以更好地解释上句话。

  • A A A 的每个成员去匹配 B B B​ 的每个成员
例题:P3390 【模板】矩阵快速幂
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7,MAXN=105;
ll n,m;
ll ans[MAXN][MAXN],a[MAXN][MAXN],t[MAXN][MAXN];
inline void mul1()
{memset(t,0,sizeof(t));for(ll k=1;k<=n;k++)for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)t[i][j]=(t[i][j]+ans[i][k]*a[k][j])%mod;for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)ans[i][j]=t[i][j];return;
}
inline void mul2()
{memset(t,0,sizeof(t));for(ll k=1;k<=n;k++)for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)t[i][j]=(t[i][j]+a[i][k]*a[k][j])%mod;for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)a[i][j]=t[i][j];return;
}
inline void quickpow()
{while(m){if(m&1)mul1();mul2();//千万不能加else!!!(血泪教训)m>>=1;}return;
}
int main(){scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;i++)for(ll j=1;j<=n;j++)scanf("%lld",&a[i][j]);for(ll i=1;i<=n;i++)ans[i][i]=1;quickpow();for(ll i=1;i<=n;i++){for(ll j=1;j<=n;j++)printf("%lld ",ans[i][j]%mod);putchar('\n');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javaSE知识点整理总结(上)

目录 一、面向对象 1. 类、对象、方法 2.面向对象三大特征 &#xff08;1&#xff09;封装 &#xff08;2&#xff09;继承 &#xff08;3&#xff09;多态 二、常用类 1.Object类 2.Array类 3.基本数据类型包装类 4.String类 5.StringBuffer类 6.Math类 7.Random…

CesiumJS【Basic】- #022A JavaScript 模块化加载:传统 <script> 标签与 type=“module“ 的比较

文章目录 JavaScript 模块化加载:传统 \<script> 标签与 type="module" 的比较1 目标2 对比2.1 带type="module"2.2 不带type="module"3 代码3.1 带type="module"3.1.1 hello.js3.1.2 index.html3.2 不带type="module&quo…

摄影楼电子相册打开的正确方式,快来看看

​随着科技的不断发展&#xff0c;电子相册已经成为许多人存储和分享照片的重要方式。然而&#xff0c;你知道如何正确打开电子相册吗&#xff1f;今天&#xff0c;我就来教大家一下电子相册的正确打开方式&#xff0c;快来学习一下吧&#xff01; 第一步&#xff1a;选择合适的…

docker 安装syslog

Syslog-ng是一个可靠、多功能的日志管理系统&#xff0c;用于收集日志并将其转发到指定的日志分析工具。 使用Docker CLI方式搭建 步骤 1: 拉取Syslog-ng镜像 首先&#xff0c;需要从Docker Hub拉取Syslog-ng的官方镜像。 docker pull balabit/syslog-ng:latest 步骤 2: 启动…

QT拖放事件之七:子类化QMimeData,实现对多个自定义类型进行数据

1、前提说明 /*自定义的MIME类型数据存储在QMimeData对象中, 存在两种方法:1. setData(...)可以把自定义类型的数据以QByteArray的形式直接存储在QMimeData中,但是使用此方法一次只能对一个MIME类型进行处理(可参考 QT拖放事件六:自定义MIME类型的存储及读取demo ) 一文。…

成立近30年,它如何找到政企采购突破点?

回看中国采购行业的发展&#xff0c;大致可以被分为四个阶段&#xff1a;上世纪90年代的传统采购时代、本世纪初的ERP采购时代、近10年的SRM采购时代以及2018年以来开启的数字化采购时代。近年来&#xff0c;大数据、人工智能和物联网的高速发展&#xff0c;为采购信息化提供底…

从探头到传感器:德思特数字化仪的全面结合与应用

电压探头可以用于转换信号电平、改变阻抗或提供更方便的连接方法。而包括电流探头、加速度计和光电倍增管在内的传感器或变送器&#xff0c;则可以将各种物理量转换为电信号。这两种输入设备都受到德思特数字化仪的支持。这篇应用笔记将介绍如何将德思特板卡式数字化仪和探头、…

psensor 的手势功能

psensor 的手势功能的移植过程 有时间再来写下

Spring6全面详解-自溜用

Spring Spring是一个框架,这个框架是用来帮我们解决一些问题的.其中就有IOC和AOP,分别是控制反转和面向切面编程 IOC: Inversion of Control,IOC容器放对象,使用map集合存放. Spring通过IOC容器进行管理所有JAVA对象的实例化和初始化,控制对象和对象之间的依赖关系,它管理的JAV…

PX2平台Pytorch源码编译

写在前面&#xff1a;以下内容完成于2019年底&#xff0c;只是把笔记放到了CSDN上。 需要注释掉NCLL及分布式相关的配置 libcudart.patch diff --git a/torch/cuda/__init__.py b/torch/cuda/__init__.py index 4591702..07e1268 100644 --- a/torch/cuda/__init__.pyb/torc…

Python中的for循环:深入解析与实用技巧

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/677661ea63b3​​ 00:01 - 详解for循环语句及其遍历功能 基本语法 Python中的for循环用于遍历集合中的元素。其基本语法如下&#xff1a; …

一文2000字记录基于jmeter+perfmon的稳定性测试

01、任务情况 1、任务总览 本次平台稳定性测试的目的在于&#xff1a;在服务器压力处于较饱和&#xff08;达到80%系统最大TPS&#xff09;压力之下&#xff0c;在较长时间&#xff08;>8小时&#xff09;之内观测服务器稳定性问题&#xff0c;以及资源使用情况和异常。 …

数仓建模—数据生命周期管理

数仓建模—数据生命周期管理 数据生命周期管理 (DLM) 是一种在从数据输入到数据销毁的整个生命周期内管理数据的方法。 数据根据不同的条件分处不同的阶段,随着其完成不同的任务或满足特定要求而逐次经历这些阶段。 一个出色的 DLM 流程提供针对企业数据的结构和组织,帮助实…

什么是异常规格(Exception Specification)

异常规格&#xff08;Exception Specification&#xff09;是C编程语言中用于声明函数可能抛出的异常类型的一种机制。以下是关于异常规格的详细解释&#xff1a; 定义与用途&#xff1a; 异常规格允许程序员在函数声明时指定该函数可能抛出的异常类型。它通过throw(exception…

ai智能语音机器人是如何影响客户体验的?电销机器人部署

随着人工智能技术的进步&#xff0c;越来越多的企业在寻求如何将人工智能技术融合到现有的商业模式上&#xff0c;进而实现自动化、智能化。在通信行业大量使用智能语音机器人、聊天机器人、客服机器人时&#xff0c;它能和“客户体验”并驾齐驱吗&#xff0c;还是可以让客户体…

【随笔】提高代码学习水平(以更高的视角看事物)

最近&#xff0c;我感觉到自己的代码水平似乎卡在了一个瓶颈。似乎只想着数仓&#xff0c;Hive&#xff0c;Spark技术优化&#xff0c;但只要稍微离开这几个点&#xff0c;我就感到无所适从。我开始反思&#xff0c;或许&#xff0c;我应该总结一下自己的学习方法。 1.站的高&…

springcloud-gateway 路由加载流程

问题 Spring Cloud Gateway版本是2.2.9.RELEASE&#xff0c;原本项目中依赖服务自动发现来自动配置路由到微服务的&#xff0c;但是发现将spring.cloud.gateway.discovery.locator.enabledfalse 启动之后Gateway依然会将所有微服务自动注册到路由中&#xff0c;百思不得其解&a…

【仿真建模-anylogic】开发规范

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-28 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 说明 实际模型开发过程中&#xff0c;对遇到的问题进行总结归纳出以下开发规范&#xff0c;仅供参考&#xff01; 1. 强制性规范 1…

vivado CLOCK_BUFFER_TYPE

时钟缓冲区类型 默认情况下&#xff0c;Vivado synthesis推断输入缓冲区和全局时钟缓冲区&#xff08;IBUF/BUFG&#xff09; 时钟端口的组合。但是&#xff0c;您可以使用IO_BUFFER_TYPE和 CLOCK_BUFFER_TYPE属性组合在一起&#xff0c;以指导Vivado合成工具更改 默认缓冲区类…

Schema Free

向量检索服务DashVector在设计上支持Schema Free&#xff0c;在插入Doc、更新Doc、插入或更新Doc时&#xff0c;可设置任意KeyValue结构的字段(Field)&#xff0c;如下所示&#xff1a; Python示例&#xff1a; collection.insert(Doc(id1,vectornp.random.rand(4),fields{na…