数学知识——矩阵乘法

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

对于一个递推问题,如递推式的每一项系数都为常数,我们可以使用矩阵快速幂来对算法进行优化。
一般形式为:
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;
}

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

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

相关文章

GitHub 趋势日报 (2025年04月07日)

GitHub 趋势日报 (2025年04月07日) 本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星语言1microsoft/markitdownPython tool for converting files and office documents to Markdown.⭐ 1039P…

ROS多设备交互

ROS多设备连接同一个Master&#xff1a;ROS Master多设备连接-CSDN博客 在多个PC端连接同一个ROS Master后&#xff0c;接下来就可以实现不同设备之间的话题交流&#xff0c;Master主机端启动不同PC端的功能包等功能了 尽管多个PC端拥有不同的ROS工作空间&#xff0c;但是只要…

基于国内环境 在Ubuntu 上安装 Docker 指南

前言 在容器化技术主导云原生时代的今天&#xff0c;Docker 凭借其轻量化、高移植性和秒级部署能力&#xff0c;已成为开发与运维的必备工具。然而&#xff0c;国内用户在 Ubuntu 系统上安装 Docker 时&#xff0c;常因 ​官方镜像源访问受限、网络延迟高、依赖包安装失败 等问…

数据结构:二叉树(三)·(重点)

二叉树的存储结构 ⼆叉树⼀般可以使⽤两种结构存储&#xff0c;⼀种顺序结构&#xff0c;⼀种链式结构。 顺序结构 顺序结构存储就是使⽤数组来存储&#xff0c;⼀般使⽤数组只适合表⽰完全⼆叉树&#xff0c;因为不是完全⼆叉树会有 空间的浪费&#xff0c;完全⼆叉树更适合…

EasyExcel实现图片导出功能(记录)

背景&#xff1a;在旧系统的基础上&#xff0c;导出一些工单信息时&#xff0c;现需要新添加处理人的签名或者签章&#xff0c;这就涉及图片的上传、下载、写入等几个操作。 1、EasyExcel工具类 &#xff08;1&#xff09;支持下拉框的导出。 import com.alibaba.excel.Easy…

Android Material Design 3 主题配色终极指南:XML 与 Compose 全解析

最小必要颜色配置 <!-- res/values/themes.xml --> <style name"Theme.MyApp" parent"Theme.Material3.DayNight"><!-- 基础三原色 --><item name"colorPrimary">color/purple_500</item><item name"col…

【Git】“warning: LF will be replaced by CRLF”的解决办法

一、原因分析 不同操作系统的换行符标准不同&#xff1a; • Windows&#xff1a;使用 CRLF&#xff08;\r\n&#xff09;表示换行&#xff1b; • Linux/Mac&#xff1a;使用 LF&#xff08;\n&#xff09;表示换行 Git 检测到本地文件的换行符与仓库设置或目标平台不兼容时…

PyTorch 深度学习实战(33):联邦学习与隐私保护

在上一篇文章中,我们探讨了多模态学习与CLIP模型的应用。本文将深入介绍联邦学习(Federated Learning)这一新兴的分布式机器学习范式,它能够在保护数据隐私的前提下实现多方协作的模型训练。我们将使用PyTorch实现一个基础的联邦学习框架,并在图像分类任务上进行验证。 一…

蓝桥杯 web 展开你的扇子(css3)

普通答案&#xff1a; #box:hover #item1{transform: rotate(-60deg); } #box:hover #item2{transform: rotate(-50deg); } #box:hover #item3{transform: rotate(-40deg); } #box:hover #item4{transform: rotate(-30deg); } #box:hover #item5{transform: rotate(-20deg); }…

LLM驱动的智能体:基于GPT的对话智能体开发指南

前言 大语言模型&#xff08;LLM, Large Language Model&#xff09;正在彻底改变智能体&#xff08;Agent&#xff09;的设计和实现方式。从简单的聊天机器人到复杂的自动化助手&#xff0c;基于GPT等LLM的对话智能体已经在客服、教育、办公自动化、编程助手等领域得到了广泛…

深度解析 C# 中介者模式:设计与实战应用

中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个对象之间的交互集中到一个中介者对象中&#xff0c;从而减少对象之间的直接交互&#xff0c;降低耦合度。在实现复杂系统时&#xff0c;中介者模式有助于提高系统的可维…

每日算法-250408

记录今天解决的两道 LeetCode 算法题&#xff0c;主要涉及二分查找的应用。 1283. 使结果不超过阈值的最小除数 题目描述 思路 核心思路是 二分查找。 解题过程 为什么可以使用二分&#xff1f; 关键在于单调性。对于一个固定的数组 nums&#xff0c;当除数 divisor 增大时&…

MySQL的子查询

一、前言 MySQL 子查询是指嵌套在其他 SQL 语句&#xff08;如 SELECT、WHERE、FROM 等&#xff09;内部的查询。用于辅助主查询完成复杂的数据筛选或计算。 二、子查询分类 标量子查询 描述&#xff1a;返回 单行单列&#xff08;一个值&#xff09;&#xff0c;常用于比较运…

Linux 基础入门操作 前言 VIM的基本操作 2

1 VIM的背景介绍 Vi 的诞生与1976年&#xff0c;Vim 的前身是 Vi&#xff08;Visual Editor&#xff09;&#xff0c;由 Bill Joy 在 BSD Unix 系统上开发&#xff0c;作为 ed&#xff08;行编辑器&#xff09;的改进版本&#xff0c;提供全屏编辑功能&#xff0c;成为 Unix/L…

Java:Set操作

目录 Set 转 List Set 转 List Set<String>set new HashSet<String>(); set.add("c"); set.add("d"); set.add("a"); set.add("a");//方法一&#xff1a; List<String>list new ArrayList<String>(set);//…

算力驱动未来:从边缘计算到高阶AI的算力革命

算力驱动未来&#xff1a;从边缘计算到高阶AI的算力革命 摘要 本文深入探讨了不同算力水平&#xff08;20TOPS至160TOPS&#xff09;在人工智能领域的多样化应用场景。从边缘计算的实时目标检测到自动驾驶的多传感器融合&#xff0c;从自然语言处理的大模型应用到AI for Scie…

虚拟机上安装openEuler和openGauss数据库

1.虚拟机版本选择VM 16 PRO 2.openEuler版本选择openEuler-22.03-LTS-SP4-x86_64 下载地址&#xff1a;https://mirrors.aliyun.com/openeuler/openEuler-22.03-LTS-SP4/ISO/x86_64/openEuler-22.03-LTS-SP4-x86_64-dvd.iso 3.虚拟机安装openEuler过程&#xff1a; 4.安装ope…

0_Pytorch中的张量操作

[引言]张量的概念 1.基本概念 张量是一个通用的多维数组&#xff0c;可以表示标量&#xff08;0 维&#xff09;、向量&#xff08;1 维&#xff09;、矩阵&#xff08;2 维&#xff09;以及更高维度的数据。张量是 PyTorch 中的核心数据结构&#xff0c;用于表示和操作数据。…

LS-LINUX-002 简易创建SSH

LS-LINUX-002 简易创建SSH 1. CentOS 8 创建和配置SSH服务 1.1 安装SSH服务 CentOS 8 默认已经安装了OpenSSH服务。如果没有安装&#xff0c;可以使用以下命令安装&#xff1a; sudo dnf install -y openssh-server1.2 启动SSH服务 安装完成后&#xff0c;需要启动SSH服务…

计算机专业求职面试的常见题目分类整理

以下是计算机专业求职面试的常见题目分类整理&#xff0c;每个大类精选20道高频问题&#xff0c;结合参考内容进行解析与扩展&#xff0c;帮助系统化备考&#xff1a; 一、数据结构与算法 解释时间复杂度和空间复杂度 时间复杂度衡量算法执行时间随输入规模的增长趋势&#xf…