斐波那契数列------矩阵幂法

news2025/7/22 7:39:38

 斐波那契数列 

斐波拉楔数是我们在学递归的使用看到的题目,但递归法是比较慢的,后面我们用循环递进来写的,但今天我有遇到了新的方法—— 矩阵幂法(线性代数的知识点)。

矩阵幂法:

F1=1*F1+0*F2;

F2=0*F1+1*F2;

F3=1*F1+1*F2;

F4=1*F1+2*F2;

………………

根据规律(自己凑出来的)可以发现:

Fn=\left [ 1,1 \right ]*^{_{\begin{bmatrix} 1 &0 \\ 1 &1 \end{bmatrix}}^{}n-1}*\begin{bmatrix} F1\\ F2 \end{bmatrix}

所以中间的^{_{\begin{bmatrix} 1 &0 \\ 1 &1 \end{bmatrix}}^{}n-1}可以用类似于快速幂的方法计算

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
long long n;
long long mod = 1e9 + 7;
long long a0[2] = { 1,0 };
long long a[2][2] = { {0,1},{1,1} };
void Multiply(long long b[][2]) {
    long long c[2][2] = { {b[0][0],b[0][1]},{b[1][0],b[1][1]} };
    for (long long i = 0; i <2; i++) {
        for (long long j = 0; j < 2; j++) {
            long long q = 0;
            for (long long z = 0; z < 2; z++) {
                q = (q + c[i][z] * c[z][j] % mod) % mod;
            }
            a[i][j] = q;
        }
    }
}
void JuZhen (long long p) {
    while (p > 0) {
        if (p % 2 == 1) {
            long long x = a0[0], y = a0[1];
            a0[0] = (x * a[0][0] % mod + y * a[1][0] % mod) % mod;
            a0[1] = (x * a[0][1] % mod + y * a[1][1] % mod) % mod;
        }
        p /= 2;
        Multiply(a);
    }
    cout << (a0[0] + a0[1]) % mod << endl;
}
int main(){
	ios::sync_with_stdio(false);        // 禁用同步
    cin.tie(nullptr);                   // 解除cin与cout绑定
    cin >> n;
    JuZhen(n-1);
    return 0;
}

计算斐波拉楔数的方法: 

1. 递归法(Recursive)

特点:直观但效率低,存在大量重复计算
时间复杂度:O(2^n)(指数级)
空间复杂度:O(n)(栈空间)

// 1. 递归法
int fib_recursive(int n) {
    if (n <= 1) return n;
    return fib_recursive(n-1) + fib_recursive(n-2);
}

2. 记忆化递归(Memoization)

特点:通过缓存避免重复计算,显著提升递归效率
时间复杂度:O(n)
空间复杂度:O(n)

// 2. 记忆化递归
int fib_memo_helper(int n, unordered_map<int, int>& memo) {
    if (n <= 1) return n;
    if (memo.find(n) == memo.end()) {
        memo[n] = fib_memo_helper(n-1, memo) + fib_memo_helper(n-2, memo);
    }
    return memo[n];
}

int fib_memo(int n) {
    unordered_map<int, int> memo;
    return fib_memo_helper(n, memo);
}

3. 迭代法(动态规划)

特点:高效且节省空间,仅存储前两个值
时间复杂度:O(n)
空间复杂度:O(1)

// 3. 迭代法
int fib_iterative(int n) {
    if (n <= 1) return n;
    int a = 0, b = 1;
    for (int i = 2; i <= n; i++) {
        int next = a + b;
        a = b;
        b = next;
    }
    return b;
}

4. 矩阵幂法(Matrix Exponentiation)

特点:利用矩阵乘法快速计算,适合超大 n 值
时间复杂度:O(log n)
空间复杂度:O(1)(忽略矩阵乘法开销)

// 4. 矩阵幂法
struct Matrix {
    long long a, b, c, d;
    Matrix(long long a, long long b, long long c, long long d) 
        : a(a), b(b), c(c), d(d) {}
};

Matrix matrix_mult(const Matrix& m1, const Matrix& m2) {
    return Matrix(
        m1.a * m2.a + m1.b * m2.c,
        m1.a * m2.b + m1.b * m2.d,
        m1.c * m2.a + m1.d * m2.c,
        m1.c * m2.b + m1.d * m2.d
    );
}

Matrix matrix_power(Matrix m, int n) {
    Matrix result(1, 0, 0, 1); // 单位矩阵
    while (n) {
        if (n & 1) {
            result = matrix_mult(result, m);
        }
        m = matrix_mult(m, m);
        n >>= 1;
    }
    return result;
}

int fib_matrix(int n) {
    if (n <= 1) return n;
    Matrix m(1, 1, 1, 0);
    Matrix result = matrix_power(m, n - 1);
    return result.a;
}

5. 通项公式法(Binet's Formula)

特点:数学公式直接计算,但浮点数精度有限
时间复杂度:O(1)(忽略幂运算开销)
空间复杂度:O(1)

// 5. 通项公式法
int fib_binet(int n) {
    const double sqrt5 = sqrt(5);
    const double phi = (1 + sqrt5) / 2;
    return round((pow(phi, n) - pow(-phi, -n)) / sqrt5);
}

6. 生成器法(Generator)

特点:惰性生成无限序列,适合流式处理
时间复杂度:O(n)(单次生成)
空间复杂度:O(1)

// 6. 生成器法
class FibonacciGenerator {
private:
    long long a = 0, b = 1;
public:
    long long next() {
        long long current = a;
        a = b;
        b = current + b;
        return current;
    }
};

总结对比

方法时间复杂度空间复杂度适用场景
递归法O(2^n)O(n)教学演示(实际避免使用)
记忆化递归O(n)O(n)需要递归且避免重复计算
迭代法O(n)O(1)最常用,平衡效率与简洁
矩阵幂法O(log n)O(1)超大规模 n(如 n > 10^6)
通项公式法O(1)O(1)小规模 n(浮点精度限制)
生成器法O(n)O(1)需要按需生成整个序列

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

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

相关文章

【Web应用】若依框架:基础篇21二次开发-页面调整

文章目录 ⭐前言⭐一、课程讲解⭐二、怎样选择设计模式&#xff1f;&#x1f31f;1、寻找合适的对象✨1) ⭐三、怎样使用设计模式&#xff1f;&#x1f31f;1、寻找合适的对象✨1) ⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内…

【 java 基础知识 第一篇 】

目录 1.概念 1.1.java的特定有哪些&#xff1f; 1.2.java有哪些优势哪些劣势&#xff1f; 1.3.java为什么可以跨平台&#xff1f; 1.4JVM,JDK,JRE它们有什么区别&#xff1f; 1.5.编译型语言与解释型语言的区别&#xff1f; 2.数据类型 2.1.long与int类型可以互转吗&…

CVE-2020-17518源码分析与漏洞复现(Flink 路径遍历)

漏洞概述 漏洞名称&#xff1a;Apache Flink REST API 任意文件上传漏洞 漏洞编号&#xff1a;CVE-2020-17518 CVSS 评分&#xff1a;7.5 影响版本&#xff1a;Apache Flink 1.5.1 - 1.11.2 修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0 漏洞类型&#xff1a;路径遍历导致的任…

Excel表格批量下载 CyberWin Excel Doenlaoder 智能编程-——玄武芯辰

使用 CyberWin Excel Downloader 进行 Excel 表格及各种文档的批量下载&#xff0c;优势显著。它能大幅节省时间&#xff0c;一次性获取大量所需文档&#xff0c;无需逐个手动下载&#xff0c;提升工作效率。可确保数据完整性与准确性&#xff0c;避免因重复操作产生失误。还便…

可编辑PPT | 基于大数据中台新能源智能汽车应用解决方案汽车大数据分析与应用解决方案

这份文档是一份关于新能源智能汽车应用解决方案的详细资料&#xff0c;它深入探讨了智能汽车行业的发展趋势&#xff0c;指出汽车正从单纯交通工具转变为网络入口和智能设备&#xff0c;强调了车联网、自动驾驶、智能娱乐等技术的重要性。文档提出了一个基于大数据中台的车企数…

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了&#xff0c;退回Rocky8麻烦机器都建好了&#xff0c;决定手动安装k8s&#xff0c;结果手动安装过程中遇到各种坑&#xff0c;这里记录下&#xff1b; k8s安装 k8s具体安装过程可自行搜索&#xff0c;或者deepseek; 也…

从 Stdio 到 HTTP SSE,在 APIPark 托管 MCP Server

MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09; 是一种由 Anthropic 公司于 2024 年 11 月推出的开源通信协议&#xff0c;旨在标准化大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具之间的交互。 它通过定义统一的接口和通信规则…

Mysql锁及其分类

目录 InnoDb锁Shared locks(读锁) 和 Exclusive locks(写锁)Exclusive locksShared locks Intention Locks(意向锁)为什么要有意向锁&#xff1f; Record Locks&#xff08;行锁&#xff09;Gap Locks&#xff08;间隙锁&#xff09;Next-Key LocksInsert Intention Locks(插入…

Postgresql源码(146)二进制文件格式分析

相关 Linux函数调用栈的实现原理&#xff08;X86&#xff09; 速查 # 查看elf头 readelf -h bin/postgres# 查看Section readelf -S bin/postgres (gdb) info file (gdb) maint info sections# 查看代码段汇编 disassemble 0x48e980 , 0x48e9b0 disassemble main# 查看代码段某…

【设计模式-4.11】行为型——解释器模式

说明&#xff1a;本文介绍行为型设计模式之一的解释器模式 定义 解释器模式&#xff08;Interpreter Pattern&#xff09;指给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句子。解释器模式是一种…

【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER

1. 环境准备 确认 Docker Desktop 配置 确保已安装 Docker Desktop for Mac (Apple Silicon)&#xff08;版本 ≥ 4.15.0&#xff09;。开启 Rosetta&#xff08;默认开启&#xff09;&#xff1a; 打开 Docker Desktop → Settings → General → Virtual Machine Options …

Quipus系统的视频知识库的构建原理及使用

1 原理 VideoRag在LightRag基础上增加了对视频的处理&#xff0c;详细的分析参考LightRag的兄弟项目VideoRag系统分析-CSDN博客。 Quipus的底层的知识库的构建的核心流程与LightRag类似&#xff0c;但在技术栈的选择和处理有所不同。Quipus对于视频的处理实现&#xff0c;与Vi…

web3-去中心化金融深度剖析:DEX、AMM及兑换交易传播如何改变世界

web3-去中心化金融深度剖析&#xff1a;DEX、AMM及兑换交易传播如何改变世界 金融问题 1.个人投资&#xff1a;在不同的时间和可能的情况&#xff08;状态&#xff09;下积累财富 2.商业投资&#xff1a;为企业家和企业提供投资生产性活动的资源 目标&#xff1a;跨越时间和…

国芯思辰|SCS5501/5502芯片组打破技术壁垒,重构车载视频传输链路,兼容MAX9295A/MAX96717

在新能源汽车产业高速发展的背景下&#xff0c;电机控制、智能驾驶等系统对高精度信号处理与高速数据传输的需求持续攀升。 针对车载多摄像头与自动驾驶辅助系统对长距离、低误码率、高抗干扰性数据传输的需求&#xff0c;SCS5501串行器与SCS5502解串器芯片组充分利用了MIPI A…

压敏电阻的选型都要考虑哪些因素?同时注意事项都有哪些?

压敏电阻&#xff0c;英文名简称VDR&#xff0c;电子元器件中重要的成员之一&#xff0c;是一种非线性伏安特性的电阻器件&#xff0c;有电阻特性的同时&#xff0c;也拥有其他自身的特性&#xff0c;广泛应用于众多领域。在电源系统、安防系统、浪涌抑制器、电动机保护、汽车电…

用WPDRRC模型,构建企业安全防线

文章目录 前言什么是 WPDRRC 模型预警&#xff08;Warning&#xff09;保护&#xff08;Protection&#xff09;检测&#xff08;Detection&#xff09;响应&#xff08;Response&#xff09;恢复&#xff08;Recovery&#xff09;反击&#xff08;Counterattack&#xff09; W…

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代&#xff0c;企业通常需要构建各种数据同步管道。例如&#xff0c;实时数仓实现从数据库到数据仓库或者数据湖的实时复制&#xff0c;为业务部门和决策团队分析提供数据结果和见解&#xff1b;再比如&#xff0c;NoSQL 游戏玩家数据&#xff0c;需要转换为 S…

Linux 里 su 和 sudo 命令这两个有什么不一样?

《小菜狗 Linux 操作系统快速入门笔记》目录&#xff1a; 《小菜狗 Linux 操作系统快速入门笔记》&#xff08;01.0&#xff09;文章导航目录【实时更新】 Linux 是一个多用户的操作系统。在 Linux 中&#xff0c;理论上来说&#xff0c;我们可以创建无数个用户&#xff0c;但…

JAVASCRIPT 简化版数据库--智能编程——仙盟创梦IDE

// 数据模型class 仙盟创梦数据DM {constructor(key) {this.key ${STORAGE_PREFIX}${key};this.data this.加载数据();}加载数据() {return JSON.parse(localStorage.getItem(this.key)) || [];}保存() {localStorage.setItem(this.key, JSON.stringify(this.data));}新增(it…

命名管道实现本地通信

目录 命名管道实现通信 命名管道通信头文件 创建命名管道mkfifo 删除命名管道unlink 构造函数 以读方式打开命名管道 以写方式打开命名管道 读操作 写操作 析构函数 服务端 客户端 运行结果 命名管道实现通信 命名管道通信头文件 #pragma#include <iostream> #include &l…