(模板)矩阵乘法:斐波那契数列问题

news2024/11/19 7:45:37

在数学上,斐波那契数列以如下被以递推的方法定义:

F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。

由以上推理公式,可以求得任何一项的斐波那契数列值。

弊端:斐波那契的值必须是由前两项推导而来,因此算F[n],一定是从F[1]开始算到F[n-1],F[n-2]为止。那么当数值范围很大时候,那么必然会TLE。

这里介绍一种方法用来解决这种问题:矩阵乘法

简要介绍一下矩阵乘法的知识:(读者应该具备矩阵的基础知识....)

我们用Ai,j表示矩阵A的第i行第j列位置上的元素

有矩阵:An,m     Bm,k     C=A*B=Cn,k

矩阵C中第i行第j列的元素为矩阵A的第i行与矩阵B的第j列的对应位置的数分别相乘后的和

当然,我们需要会求矩阵n次幂:为什么?

因为:在很多问题中,我们在处理递推公式或者动态规划的转移方程时,第i项的值可以由之前的k项推得:即:

我们还需要构造一个矩阵使得满足这个公式: 

有:

再转换一下:

这里具体给一个题目解释一下:因为关于矩阵乘法,如果读者需要,我就专门写一遍矩阵乘法的知识讲解吧。这里简要的讲一下就行啦。 

  题目选自:http://oj.daimayuan.top/course/22/problem/1045

 代码:

//基础模板
#include <bits/stdc++.h>
using namespace std;
const int P=1e9+7;
const int N=2;
long long a[N+1][N+1];
long long f[N+1];
int k,n=2;

void aa(){//矩阵幂:A*A=A^2
	long long w[N+1][N+1];//用w数组临时记录A^2的矩阵
	memset(w,0,sizeof(w));
	for(int i=1;i<=n;i++)
	for(int k=1;k<=n;k++)
		if(a[i][k])
			for(int j=1;j<=n;j++)
				if(a[k][j])
					w[i][j]+=a[i][k]*a[k][j],w[i][j]%=P;	
	memcpy(a,w,sizeof(a));//copy一遍,用A^2矩阵替代A矩阵
}

void fa(){//f数组 * 矩阵A  :公式推导
	long long w[N+1];
	memset(w,0,sizeof(w));
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			w[i]+=f[j]*a[j][i];
			w[i]%=P;
		}
	}
	memcpy(f,w,sizeof(f));
}

void matrixpow(int k){//矩阵快速幂//跟常数快速幂具备同等思想
	while(k){
		if(k&1) fa();
		aa();
		k>>=1;
	}
}

int main(){
	cin>>k;
	f[1]=0;f[2]=1;
//构造的A矩阵
	a[1][1]=0;a[1][2]=1;
	a[2][1]=1;a[2][2]=1;
//
	matrixpow(k-1);//进行k-1次
	cout<<f[2];//根据推导公式:f[1]=n-1   f[2]=n
}

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

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

相关文章

UI自动化测试-pytest框架

在进行UI自动化测试的时候&#xff0c;我们需要工具来对测试用例进行收集&#xff0c;执行&#xff0c;标记&#xff0c;参数化。pytest就是这样一个工具。 pytest实际是python的一个单元测试框架&#xff0c;其他还有如unittest等&#xff0c;它可以实现按照规则搜索测试用例…

国产化服务环境中使用gunicorn部署Flask应用并配置开机自启

背景 服务端由第三方部署了一个基于 darknet &#xff08;一个较为轻型的完全基于C与CUDA的开源深度学习框架&#xff09;的识别算法服务&#xff0c;通过 Flask 的 Web 服务对业务服务暴露 API 接口。作为测试&#xff0c;一开始是直接通过 python3 app.py 的命令行启动的服务…

Ubuntu安装Anaconda详细步骤

本文主要讲述了在Ubuntu中安装anaconda的具体步骤。 准备环境&#xff1a;Ubuntu&#xff0c;Anaconda3 一、安装Anaconda3 在清华镜像下载Linux版本的anaconda&#xff1a; https://mirrors.bfsu.edu.cn/anaconda/archive/我选择的是Anaconda3-2022.10-Linux-x86_64.sh 下…

数组(7)

目录 1、一维数组 1、数组的创建 2、数组的初始化 3、一维数组的使用 4、一维数组在内存中的存储 2、二维数组 1、二维数组的创建 2、二维数组的初始化 3、二维数组的使用 4、二维数组在内存中的存储 3、数组越界 4、数组作为函数参数 1、冒泡排序&#xff1a; 5…

【学习笔记12.24】关于事务你必须知道的几件事

文章目录事务基础知识什么是事务&#xff1f;开启事务事务隔离级别事务基础知识 在MySQL中&#xff0c;只有InnoDB存储引擎是支持事务的。 什么是事务&#xff1f; 事务是逻辑操作的最小单元&#xff0c;使数据从一个状态转变为另一个状态。 也可以通过事务四大特性ACID来更…

SAP ERP 里的 Costing Sheet 成本核算表

有朋友在我的知识星球里向我提问&#xff1a; 请您帮忙讲一下这个AP0100的costing sheet rows这里都表示什么意思吗&#xff1f;比如row10、base Z010、overhead啥、描述、from、to row、credit都说明了什么&#xff0c;能够实现上面&#x1f446;&#x1f3fb;的目标吗&#x…

fpga实操训练(vga测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 我自己读书那会&#xff0c;买的电脑还是以台式机居多&#xff0c;平板显示器也是才刚刚流行、且价格较高&#xff0c;视频接口也是以VGA为主。不像…

Linux搭建TFTP服务

TFTP是简单文件传输协议,是一个基于UDP协议实现的用在客户及和服务器之间进行简单文件传输的协议,适用于开销不大,不复杂的应用场景。TFTP协议专门为小文件传输而设计,只能从服务器获取文件,或者客户端往服务器写入文件,但是不能进行认证也不能列出目录。 1、安装tftp服…

RV1126笔记十五:吸烟行为检测及部署<三>

若该文为原创文章,转载请注明原文出处。 训练并测试(windows) 一、yolov5安装 1、下载rk优化后的yolov5 git clone https://github.com/airockchip/yolov5.git 下载后,我是放到E:\miniconda3\envs目录下,miniconda3是安装miniconda的目录。可以放到其他地方,后续操作需要…

MySQL提高批量insert的性能

一. 使用批量插入&#xff0c;将多条单独的 insert 合并成一次操作 即&#xff1a;insert into table values (a1, b1, c1), (a2, b2, c2); 解析&#xff1a;将多条 insert 合并后&#xff0c;减少MySQL日志量(即MySQL的 binlog 和 innodb 的事务日志)&#xff0c;降低日志刷…

Python pandas有好几百个库函数,你都用过吗(1)

对Python的 pandas 库所有的内置元类、函数、子模块等全部浏览一遍&#xff0c;然后挑选一些重点学习一下。我安装的库版本号为1.3.5&#xff0c;如下&#xff1a; >>> import pandas as pd >>> pd.__version__ 1.3.5 >>> print(pd.__doc__)pandas…

54三数之和55 56有无重复元素的全排列

54 三数之和 首先想到的就是之前的两数之和&#xff0c;只要在外层遍历一遍&#xff0c;对每个元素用之前的两数之和的哈希做法&#xff0c;就刚好是O(n^2) 但是有坑的地方在于需要去重&#xff0c;并且输出的三元组也是需要顺序的&#xff01;&#xff01;然后我用set去重和重…

c语言复习之预编译(十四)

1.以#开头的行&#xff0c;都称为编译器指令 #define定义宏#if #else #elif #endif条件编译#ifdef #ifndef判断是否定义了某个宏#error错误#program设定状态或指定完成&#xff08;编译器&#xff09;#undef取消宏定义 2.预定义宏 __LINE__行号__FILE__源文件名__DATE__创建…

你以为架构师天天就画图写PPT吗,告诉你其他事儿多了去了~

V-xin&#xff1a;ruyuan0330 获得600页原创精品文章汇总PDF 目录 一、多系统订阅数据回顾二、核心数据的监控系统三、电商库存数据如何监控四、数据计算链路追踪五、百亿流量下的数据链路追踪六、自动化数据链路分析七、下篇预告 上篇文章《为什么我建议线上高并发量的代码&a…

rip综合实验

目录 1.拓扑图 2.要求 3.要求分析 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.要求 R1代表运营商&#xff0c;R1远程登录R2实际登录R9R3访问R7的环回&#xff0c;实际走下面全网可达 3.要求分析 将R2包括右边所有设备理解为一个局域网&#xff0c;在R2的出接口上配置NAT…

BIT.3_Linux进程概念

目录冯诺依曼体系结构操作系统(Operator System)概念设计OS的目的定位如何理解 "管理"总结系统调用和库函数概念进程概念知识点基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类组织进程查看进程通过系统调用获取进程标示符通过系统调用创建进程-fork…

上次面试跪在了Redis上,刷完腾讯云大神亲码的“redis深度笔记”,终面进腾讯!

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要使…

使用PicGo+阿里云OSS实现md文档图片上传

使用PicGo阿里云OSS实现md文档图片上传 这次给大家带来的是PicG0阿里云Osstypora的图床环境搭建&#xff0c;帮助大家提高工作效率写博客速度&#xff01; 1.typora安装 给大家一个链接&#xff1a;typora&#xff0c;打开后点击下载就行&#xff0c;正式版收费&#xff0c;…

Qt扫盲-QTextBrowser理论总结

QTextBrowser理论总结1. 简述2. 文档来源和内容3. 导航4. 用途1. 简述 QTextBrowser 顾名思义其实就是一个文本阅读器&#xff0c;但是这个类类扩展了 QTextEdit 的只读模式功能&#xff0c;当然了 QTextEdit 其实也就是QTextBrowser 的父类。添加的功能主要是一些导航 naviga…

对路由的基本理解和使用

一、认识路由 1、生活中的路由器 构造&#xff1a;路由器上有多个网线接口&#xff0c;每一个接口都对应一台设备 功能&#xff1a;多台设备能同时上网 2、编程中的路由和路由器 &#xff08;1&#xff09;后端渲染和后端路由 ①概念 早期的网站开发整个HTML页面是由服务器…