当前位置: 首页 > article >正文

数学知识——矩阵乘法

使用矩阵快速幂优化递推问题

对于一个递推问题,如递推式的每一项系数都为常数,我们可以使用矩阵快速幂来对算法进行优化。
一般形式为:
F n = F 1 × A n − 1 F_n=F_1×A^{n-1} Fn=F1×An1
由于递推式的每一项系数都为常数,因此对于每一步的递推, A A A里面都是相同的常数。
对于 A n − 1 A^{n-1} An1部分使用快速幂求解,根据 F n F_n Fn就能得到最终答案。

矩阵快速幂:

void mul(int c[][N], int a[][N], int b[][N])
{int temp[N][N] = {0};for (int i = 0; i < N; i ++ )for (int j = 0; j < N; j ++ )for (int k = 0; k < N; k ++ )temp[i][j] = (temp[i][j] + (ll)a[i][k] * b[k][j] % m) % m;memcpy(c, temp, sizeof temp);
}
while (k){if (k & 1) mul(f, f, a);mul(a, a, a);k >>= 1;}

斐波那契数列的前n项和

大家都知道 Fibonacci 数列吧, f 1 = 1 , f 2 = 1 , f 3 = 2 , f 4 = 3 , … , f n = f n − 1 + f n − 2 f_1=1,f_2=1,f_3=2,f_4=3,…,f_n=f_{n−1}+f_{n−2} f1=1,f2=1,f3=2,f4=3,,fn=fn1+fn2
现在问题很简单,输入 n n n m m m,求 f n f_n fn的前 n n n 项和 S n ( m o d m ) S_n(mod\ m) Sn(mod m)

输入格式

共一行,包含两个整数 n n n m m m

输出格式

输出前 n n n 项和 S n ( m o d m ) S_n (mod\ m) Sn(mod m) 的值。

数据范围
1 ≤ n ≤ 2000000000 , 1≤n≤2000000000, 1n2000000000,
1 ≤ m ≤ 1000000010 1≤m≤1000000010 1m1000000010

输入样例:

5 1000

输出样例:

12

我们有递推关系:
f n = f n − 1 + f n − 2 f_n=f_{n-1}+f_{n-2} fn=fn1+fn2
S n = S n − 1 + f n S_n=S_{n-1}+f_n Sn=Sn1+fn
F n = [ f n , f n + 1 , S n ] F_n=[f_n,f_{n+1},S_n] Fn=[fn,fn+1,Sn],有 F n × A = F n + 1 F_n×A=F_{n+1} Fn×A=Fn+1,根据递推关系求解矩阵 A A A
[ f n , f n + 1 , S n ] × [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] = [ f n + 1 , f n + 2 , S n + 1 ] [f_n,f_{n+1},S_n]× \begin{bmatrix} a_{11} & a_{12}& a_{13}\\ a_{21}& a_{22}& a_{23}\\ a_{31} & a_{32} & a_{33} \end{bmatrix}=[f_{n+1},f_{n+2},S_{n+1}] [fn,fn+1,Sn]× a11a21a31a12a22a32a13a23a33 =[fn+1,fn+2,Sn+1]

求解得到 A = [ 0 1 0 1 1 1 0 0 1 ] A = \begin{bmatrix} 0 & 1 & 0 \\ 1 & 1 & 1 \\ 0 & 0 & 1 \end{bmatrix} A= 010110011

F 1 = [ 1 , 1 , 1 ] F_1=[1,1,1] F1=[1,1,1],最终答案为 F 1 × A n − 1 F_1×A^{n-1} F1×An1,对于 A n − 1 A^{n-1} An1部分采用快速幂来计算,时间复杂度为 O ( l o g n ∗ 3 3 ) O(logn*3^3) O(logn33)

佳佳的斐波那契

佳佳对数学,尤其对数列十分感兴趣。

在研究完 Fibonacci 数列后,他创造出许多稀奇古怪的数列。

例如用 S ( n ) S(n) S(n) 表示 Fibonacci 前 n n n 项和 m o d m mod\ m mod m 的值,即 S ( n ) = ( F 1 + F 2 + … + F n ) m o d m S(n)=(F_1+F_2+…+F_n)mod\ m S(n)=(F1+F2++Fn)mod m,其中 F 1 = F 2 = 1 , F i = F i − 1 + F i − 2 F_1=F_2=1,F_i=F_{i−1}+F_{i−2} F1=F2=1,Fi=Fi1+Fi2

可这对佳佳来说还是小菜一碟。

终于,她找到了一个自己解决不了的问题。

T ( n ) = ( F 1 + 2 F 2 + 3 F 3 + … + n F n ) m o d m T(n)=(F_1+2F_2+3F_3+…+nF_n)mod\ m T(n)=(F1+2F2+3F3++nFn)mod m 表示 Fibonacci 数列前 n n n 项变形后的和 m o d m mod\ m mod m 的值。

现在佳佳告诉你了一个 n n n m m m,请求出 T ( n ) T(n) T(n)的值。

输入格式

共一行,包含两个整数 n n n m m m

输出格式

共一行,输出 T ( n ) T(n) T(n) 的值。

数据范围
1 ≤ n , m ≤ 2 31 − 1 1≤n,m≤2^{31−1} 1n,m2311

输入样例:

5 5

输出样例:

1

样例解释
T ( 5 ) = ( 1 + 2 × 1 + 3 × 2 + 4 × 3 + 5 × 5 ) m o d 5 = 1 T(5)=(1+2×1+3×2+4×3+5×5)mod\ 5=1 T(5)=(1+2×1+3×2+4×3+5×5)mod 5=1

我们有递推关系:
f n = f n − 1 + f n − 2 f_n=f_{n-1}+f_{n-2} fn=fn1+fn2
S n = S n − 1 + f n S_n=S_{n-1}+f_n Sn=Sn1+fn
T n = T n − 1 + n ∗ f n T_n=T_{n-1}+n*f_n Tn=Tn1+nfn
但是对于 T n = T n − 1 + n ∗ f n T_n=T_{n-1}+n*f_n Tn=Tn1+nfn f n f_n fn的系数不为常数,所以无所用矩阵快速幂来优化。

P n = n S n − T n P_n=nS_n-T_n Pn=nSnTn,那么有:
P n = ( n − 1 ) S 1 + ( n − 2 ) S 2 . . . + S n − 1 P_n=(n-1)S_1+(n-2)S_2...+S_{n-1} Pn=(n1)S1+(n2)S2...+Sn1,
P n + 1 = n S 1 + ( n − 1 ) S 2 . . . + 2 S n − 1 + S n P_{n+1}=nS_1+(n-1)S_2...+2S_{n-1}+S_{n} Pn+1=nS1+(n1)S2...+2Sn1+Sn,
P n + 1 − P n = S n P_{n+1}-P_n=S_n Pn+1Pn=Sn
于是,我们有以下三组递推关系:
f n = f n − 1 + f n − 2 f_n=f_{n-1}+f_{n-2} fn=fn1+fn2
S n = S n − 1 + f n S_n=S_{n-1}+f_n Sn=Sn1+fn
P n = P n − 1 + S n − 1 P_n=P_{n-1}+S_{n-1} Pn=Pn1+Sn1
每一组的系数都为常数,我们可以使用矩阵快速幂来优化。
F n = [ f n , f n + 1 , S n , P n ] F_n=[f_n,f_{n+1},S_n,P_n] Fn=[fn,fn+1,Sn,Pn],有 F n × A = F n + 1 F_n×A=F_{n+1} Fn×A=Fn+1,根据递推关系求解矩阵 A A A
[ f n , f n + 1 , S n , P n ] × [ a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ] = [ f n + 1 , f n + 2 , S n + 1 , P n + 1 ] [f_n,f_{n+1},S_n,P_n]× \begin{bmatrix} a_{11} & a_{12}& a_{13}& a_{14}\\ a_{21}& a_{22}& a_{23}& a_{24}\\ a_{31} & a_{32} & a_{33}& a_{34}\\ a_{41} & a_{42} & a_{43}& a_{44}\\ \end{bmatrix}=[f_{n+1},f_{n+2},S_{n+1},P_{n+1}] [fn,fn+1,Sn,Pn]× a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44 =[fn+1,fn+2,Sn+1,Pn+1]
根据递推关系,解出
A = [ 0 1 0 0 1 1 1 0 0 0 1 1 0 0 0 1 ] A = \begin{bmatrix} 0 & 1 & 0 & 0\\ 1 & 1 & 1 & 0\\ 0 & 0 & 1 & 1\\ 0 & 0 & 0 & 1 \end{bmatrix} A= 0100110001100011
F 1 = [ 1 , 1 , 1 , 0 ] , F_1=[1,1,1,0], F1=[1,1,1,0], F n = F 1 × A n − 1 F_n=F_1×A^{n-1} Fn=F1×An1
解出来 S n S_n Sn P n P_n Pn,最终答案 T n = n S n − P n T_n=nS_n-P_n Tn=nSnPn
时间复杂度为 O ( l o g n ∗ 4 3 ) O(logn*4^3) O(logn43)

#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 4;
int n, m;
void mul(int a[][N], int b[][N], int c[][N])
{int temp[N][N] = {0};for (int i = 0; i < N; i ++ )for (int j = 0; j < N; j ++ )for (int k = 0; k < N; k ++ )temp[i][j] = (temp[i][j] + (ll)b[i][k] * c[k][j] % m) % m;memcpy(a, temp, sizeof temp);
}
int main()
{cin >> n >> m;int f[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(f, f, a);mul(a, a, a);k >>= 1;}cout << ((ll)n * f[0][2]% m - f[0][3] + m) % m << endl;return 0;
}

相关文章:

数学知识——矩阵乘法

使用矩阵快速幂优化递推问题 对于一个递推问题&#xff0c;如递推式的每一项系数都为常数&#xff0c;我们可以使用矩阵快速幂来对算法进行优化。 一般形式为&#xff1a; F n F 1 A n − 1 F_nF_1A^{n-1} Fn​F1​An−1 由于递推式的每一项系数都为常数&#xff0c;因此对…...

左右开弓策略思路

一、策略概述 本策略是一种基于多种技术指标的复杂交易策略&#xff0c;包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现&#xff0c;旨在通过分析历史价格数据来预测未来价格走势&#xff0c;并据此生成交易信号。 二、主要技术指标…...

将jar包制作成deb一键安装包

文章目录 准备环境准备deb包结构构建Deb包测试安装常用操作命令 本文介绍如何将java运行环境、jar程序一起打包成一个deb格式的安装包&#xff0c;创建桌面图标&#xff0c;通过点击图标可使用系统自带浏览器快捷访问web服务的URL&#xff0c;同时注册服务并配置好开机自启。 准…...

Java 常用安全框架的 授权模型 对比分析,涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型,结合框架实现方式、适用场景和优缺点进行详细说明

以下是 Java 常用安全框架的 授权模型 对比分析&#xff0c;涵盖 RBAC、ABAC、ACL、基于权限/角色 等模型&#xff0c;结合框架实现方式、适用场景和优缺点进行详细说明&#xff1a; 1. 授权模型类型与定义 模型名称定义特点RBAC&#xff08;基于角色的访问控制&#xff09;通…...

aws平台练习

注册 AWS 账户 访问 AWS 官方网站&#xff0c;点击“免费注册”按钮&#xff0c;按照提示完成账户注册&#xff1a; 提供电子邮件地址、密码和电话号码。 验证身份&#xff08;可能需要手机验证码&#xff09;。 设置 billing 信息。 2. 登录 AWS 管理控制台 使用注册的邮箱和…...

力扣DAY40-45 | 热100 | 二叉树:直径、层次遍历、有序数组->二叉搜索树、验证二叉搜索树、二叉搜索树中第K小的元素、右视图

前言 简单、中等 √ 好久没更了&#xff0c;感觉二叉树来回就那些。有点变懒要警醒&#xff0c;不能止步于笨方法&#xff01;&#xff01; 二叉树的直径 我的题解 遍历每个节点&#xff0c;左节点最大深度右节点最大深度当前节点当前节点为中心的直径。如果左节点深度更大…...

【MYSQL从入门到精通】数据类型及建表

一些基础操作语句 1.使用客户端工具连接数据库服务器&#xff1a;mysql -uroot -p 2.查看所有数据库&#xff1a;show databases; 3.创建属于自己的数据库&#xff1a; create database 数据库名;create database if not exists 数据库名; 强烈建议大家在建立数据库时指定编…...

【动态规划】 深入动态规划—两个数组的dp问题

文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开&#xff0c;旨在通过对这两个数组元素间关系的分析&#xff0c;找出…...

结合大语言模型整理叙述并生成思维导图的思路

楔子 我比较喜欢长篇大论。这在代理律师界被视为一种禁忌。 我高中一年级的时候因为入学成绩好&#xff08;所在县榜眼名次&#xff09;&#xff0c;直接被所在班的班主任任命为班长。我其实不喜欢这个岗位。因为老师一来就要提前注意到&#xff0c;要及时喊“起立”、英语课…...

Kotlin学习

kotlin android 开源,Kotlin开源项目集合_晚安 呼-华为开发者空间 干货来袭&#xff0c;推荐几款开源的Kotlin的Android项目 https://zhuanlan.zhihu.com/p/536789267 【已解决】 ubuntu apt-get update连不上dl.google.com_为什么不能ping谷歌-CSDN博客...

若依前后端分离版本从mysql切换到postgresql数据库

一、修改依赖&#xff1a; 修改admin模块pom.xml中的依赖,屏蔽或删除mysql依赖&#xff0c;增加postgresql依赖。 <!-- Mysql驱动包 --> <!--<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId> &l…...

【力扣hot100题】(073)数组中的第K个最大元素

花了两天时间搞明白答案的快速排序和堆排序。 两种都写了一遍&#xff0c;感觉堆排序更简单很多。 两种都记录一下&#xff0c;包括具体方法和易错点。 快速排序 class Solution { public:vector<int> nums;int quicksort(int left,int right,int k){if(leftright) r…...

【AAOS】【源码分析】CarAudioService(二)-- 功能介绍

汽车音频是 Android 汽车操作系统 (AAOS) 的一项功能,允许车辆播放信息娱乐声音,例如媒体、导航和通信。AAOS 不负责具有严格可用性和时间要求的铃声和警告,因为这些声音通常由车辆的硬件处理。将汽车音频服务集成在汽车中,彻底改变了驾驶体验,为驾驶员和乘客提供了音乐、…...

mapbox基础,加载F4Map二维地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…...

Android:Android Studio右侧Gradle没有assembleRelease等选项

旧版as是“Do not build Gradle task list during Gradle sync” 操作这个选项。 参考这篇文章&#xff1a;Android Studio Gradle中没有Task任务&#xff0c;没有Assemble任务&#xff0c;不能方便导出aar包_gradle 没有task-CSDN博客 在as2024版本中&#xff0c;打开Setting…...

DRAM CRC:让DDR5内存数据更靠谱

DRAM(动态随机存取存储器)是电脑内存的核心部件,负责存储和传输数据。如果数据在传输中出错,后果可能很严重,比如程序崩溃或者数据损坏。为了解决这个问题,DDR5内存引入了一个新功能,叫DRAM CRC(循环冗余校验)。简单来说,它是用来检查读写数据有没有问题的工具。 下面…...

RAI Toolbox详解

RAI Toolbox详解 摘要 RAI Toolbox是一个综合性的工具集&#xff0c;旨在帮助开发者和AI系统利益相关者更负责任地开发和监控AI系统&#xff0c;并做出更好的数据驱动决策。本文将详细介绍RAI Toolbox的功能、使用场景以及与类似AI项目的对比&#xff0c;帮助读者全面了解RAI…...

心率测量-arduino+matlab

参考&#xff1a;【教程】教你玩转Stduino之手指心跳检测模块 - 知乎 (zhihu.com) 1 原理 心跳检测模块&#xff0c;由一个红外线发射LED和红外接收器构成。手指心跳监测模块能够测量脉搏&#xff0c;是这样工作的&#xff1a;当手指放在发射器与接收器之间&#xff0c;红外发射…...

H3C的MSTP+VRRP高可靠性组网技术(MSTP单域)

以下内容纯为博主分享自己的想法和理解&#xff0c;如有错误轻喷 MSTP多生成树协议可以基于不同实例实现不同VLAN之间的负载分担 VRRP虚拟路由器冗余协议可以提高网关的可靠性防止单点故障的可能 在以前这两种协议通常一起搭配组网&#xff0c;来提高网络的可靠性和稳定性&a…...

字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口)

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;每日两三题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 字符串替换 &#xff08;模拟&#xff09;神奇数 &#xff08;数学&#xff09;DNA序列 &#xff08;固定长度的滑动窗口&am…...

Centos7下安装hive详细步骤

在Centos 7系统上安装Hive的步骤如下&#xff1a; 下载Hive&#xff1a;首先&#xff0c;在Apache Hive的官方网站上下载最新版本的Hive压缩包&#xff0c;地址为&#xff1a;https://hive.apache.org/downloads.html。选择合适的版本并下载。 解压Hive压缩包&#xff1a;将下…...

Verilog学习-1.模块的结构

module aoi(a,b,c,d,f);/*模块名为aoi&#xff0c;端口列表a、b、c、d、f*/ input a,b,c,d;/*模块的输入端口为a,b,c,d*/ output f;;/*模块的输出端口为f*/ wire a,b,c,d,f;/*定义信号的数据类型*/ assign f~((a&b)|(~(c&d)));/*逻辑功能描述*/ endmoduleveirlog hdl 程…...

Linux驱动-块设备驱动

Linux驱动-块设备驱动 一&#xff0c;块设备驱动简介二&#xff0c;无请求队列情况&#xff08;EMMC和SD卡等&#xff09;三&#xff0c;请求队列情况&#xff08;磁盘等带有I/O调度的设备&#xff09;四&#xff0c;两者在驱动上区别 一&#xff0c;块设备驱动简介 块设备驱动…...

ffmpeg函数简介(封装格式相关)

文章目录 &#x1f31f; 前置说明&#xff1a;FFmpeg 中 AVFormatContext 是什么&#xff1f;&#x1f9e9; 1. avformat_alloc_context功能&#xff1a;场景&#xff1a; &#x1f9e9; 2. avformat_open_input功能&#xff1a;说明&#xff1a;返回值&#xff1a; &#x1f9…...

Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决

1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…...

[随笔] nn.Embedding的前向传播与反向传播

nn.Embedding的前向传播与反向传播 nn.Embedding的前向计算过程 embedding module 的前向过程其实是一个索引&#xff08;查表&#xff09;的过程 表的形式是一个 matrix&#xff08;embedding.weight, learnable parameters&#xff09; matrix.shape: (v, h) v&#xff1a;…...

搜广推校招面经七十一

滴滴算法工程师面经 一、矩阵分解的原理与优化意义 矩阵分解在推荐系统中是一个非常核心的方法&#xff0c;尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好&#xff0c;从而推荐他们可能喜欢的内容。 1.1. 直观理解&…...

【算法学习】链表篇:链表的常用技巧和操作总结

算法学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言&#xff1a; 在各种数据结构中&#xff0c;链表是最常用的几个之一&#xff0c;熟练使用链表和链表相关的算法&#xff0c;可以让我们在处理很多问题上都更加…...

View UI (iview)表格拖拽排序

在使用 iView UI 的 Table 组件进行拖拽排序时&#xff0c;可以通过以下步骤获取最新的排序数据&#xff1a; 1. 启用拖拽功能 在 Table 组件上设置 draggable 属性&#xff0c;并绑定拖拽结束事件 on-row-drop。 <template><Table:columns"columns":dat…...

OpenNMT 部署和集成指南

OpenNMT&#xff08;Open Neural Machine Translation&#xff09;是一个开源的神经机器翻译&#xff08;NMT&#xff09;系统&#xff0c;由 Systran 和 Harvard NLP Group 在 2016 年联合推出。它的目标是为研究人员和企业开发者提供一个高质量、灵活且易于扩展的机器翻译框架…...