【AcWing】蓝桥杯集训每日一题Day27|矩阵乘法|快速幂|205.斐波那契(C++)

205.斐波那契
205. 斐波那契 - AcWing题库
难度:中等
时/空限制:1s / 64MB
总通过数:3220
总尝试数:4747
来源:

《算法竞赛进阶指南》
算法标签

数学知识矩阵乘法快速幂

题目内容

在斐波那契数列中,
F i b 0 = 0 , F i b 1 = 1 , F i b n = F i b n − 1 + F i b n − 2 Fib_{0}=0,Fib_{1}=1,Fib_{n}=Fib_{n-1}+Fib_{n-2} Fib0=0,Fib1=1,Fibn=Fibn1+Fibn2
(n>1)。
给定整数 n,求  F i b n Fib_{n} Fibn mod 10000。

输入格式

输入包含不超过 100 组测试用例。
每个测试用例占一行,包含一个整数 n。
当输入用例 n=−1 时,表示输入终止,且该用例无需处理。

输出格式

每个测试用例输出一个整数表示结果。
每个结果占一行。

数据范围

0≤n≤2×10^9

输入样例:
0
9
999999999
1000000000
-1
输出样例:
0
34
626
6875
题目解析

怕溢出,求第n项模10000的结果,这样就不需要写高i精度

不超过100组数据
对于每一个n,求斐波那契数列第n项模10000的结果

数据范围是0~20亿
不能用递推的方法来做,计算量是2000亿

如何优化
斐波那契数列有通项公式

a n = 1 ÷ 5 [ ( 1 + 5 2 ) n − ( 1 − 5 2 ) n ] a_{n}=1\div \sqrt{ 5 } [\left( \frac{1+\sqrt{ 5 }}{2} \right)^n-\left( \frac{1-\sqrt{ 5 }}{2} \right)^n ] an=1÷5 [(21+5 )n(215 )n]
但是这个式子不适合这道题,需要做高精度,而且还要把n项精确求出来,没办法求余数

用矩阵乘法快速幂的方式,容易取余数

如果可以把一道题目转换成矩阵的乘法来计算的话,就可以用快速幂来优化

先把递推的方法用一个矩阵表示出来
因为每一项都和前两项有关系,可以把 a n − 1 a_{n-1} an1 a n a_{n} an放到一个矩阵中,是一个1x2的矩阵
乘以一个2x2的矩阵,就可以得到一个新的1x2的矩阵
新的1x2的矩阵就是每一项往后递推, a n a_{n} an a n + 1 a_{n+1} an+1

如何构造矩阵,从定义来看
根据矩阵乘法规则
[ a n − 1 a n ] × [ 01 11 ] = [ a n a n + 1 ] \begin{bmatrix}{} a_{n-1} \qquad an \end{bmatrix} \times \begin{bmatrix}{} 0 1 \\ 11 \end{bmatrix}= \begin{bmatrix}{} a_{n} \qquad a_{n+1} \end{bmatrix} [an1an]×[0111]=[anan+1]
把矩阵第一个元素的下标当作矩阵的下标
A n = A n − 1 × F A_{n}=A_{n-1} \times F An=An1×F
同理
A n = A n − 2 × F × F A_{n}=A_{n-2} \times F \times F An=An2×F×F
… \dots
A n = A 0 × F ⋯ × F A_{n}=A_{0} \times F\dots \times F An=A0×F×F
矩阵乘法有结合律
A n = A 0 × F n A_{n}=A_{0} \times F^n An=A0×Fn
= [ 0 , 1 ] × [ 01 11 ] n =\begin{bmatrix}{} 0,1 \end{bmatrix} \times \begin{bmatrix}{} 0 1 \\ 11 \end{bmatrix}^n =[0,1]×[0111]n
求矩阵的n次方,可以类似用整数的快速幂来求
快速幂能用的前提是具有结合律

快速幂求法,时间复杂度是 O ( log ⁡ n ) O(\log n) O(logn)
矩阵乘法,复杂度再乘8

总共2万4的计算量,能过

如果用C++实现矩阵乘法的话,需要存1x2的数组和2x2的数组,还需要写两个函数,比较麻烦

如何只写一个函数

把1x2的矩阵扩充一下,下面加两个0,结果还是不变的

代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int MOD = 10000;void mul(int a[][2], int b[][2])
{//先定义一下结果数组int c[2][2] = {0};for (int i = 0; i < 2; i ++)for (int j = 0; j < 2; j ++)for (int k = 0; k < 2; k ++)c[i][j] = (c[i][j] + a[i][k] * b[k][j]) % MOD;memcpy (a, c, sizeof c);//把c数组赋值到a上
}int fib(int n)
{int a[2][2] = {0, 1, 0, 0};int f[2][2] = {0, 1, 1, 1};//快速幂while (n){//如果n是奇数的话if (n & 1) mul(a, f);mul(f, f);n >>= 1;}return a[0][0];
}int main()
{int n;//逗号表达式,值等于最后一个表达式的值,这两个式子的值其实就是n!=-1while (cin >> n, n != -1)cout << fib(n) << endl;return 0;
}

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

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

相关文章

【学习路径】AI入门路线分享

近期整理飞书文档&#xff0c;一些权限被关掉了。看好多人在申请访问这个飞书文档&#xff0c;于是把它单独拿出来放在CSDN上&#xff0c;供大家参考~ 原视频地址&#xff1a;AI&#xff1a;从小白到入门&#xff0c;超详细人工智能成长路径分享_哔哩哔哩_bilibili 文章目录 1.…

OpenStack (T)部署trove

环境&#xff1a;Openstack&#xff08;T&#xff09; CentOS Linux release 7.9.2009 (Core) 正文&#xff1a; 1.控制节点安装trove软件包 # yum install openstack-trove-guestagent openstack-trove python-troveclient openstack-trove-ui –y2.创建数据库&#xff0c…

2024-04-12 问AI: 在深度学习中,什么是参数,什么是超参数?

文心一言 在深度学习中&#xff0c;参数和超参数是两个非常重要的概念&#xff0c;它们在模型的训练和调优过程中起着关键的作用。以下是它们的基本定义和区别&#xff1a; 参数&#xff08;Parameters&#xff09;&#xff1a; 参数是模型在训练过程中学习的变量。它们是从数…

C++11 设计模式3. 工厂方法模式

简单工厂模式的遗留问题 //从上面的代码可以看到&#xff0c;简单工厂模式确实实现了new 出来具体对象&#xff0c; 和 业务逻辑的分离&#xff0c; //但是不符合 "开闭原则" //"开闭原则"说的是代码扩展性问题——对扩展开放&#xff0c;对修改关…

如何在OceanBase v4.2 中快速生成随机数据

在使用传统数据库如 MySQL 和 Oracle 时&#xff0c;由于缺乏多样化的随机数据生成方案&#xff0c;或者实现成本过高&#xff0c;构造随机数据的开发成本受到了影响。OceanBase在老版本中虽然有相应的解决方案&#xff0c;但语法复杂和性能较差等问题仍然存在。 现在&#xf…

【漏洞复现】润乾报表平台 InputServlet接口处存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

报错[Vue warn]: $attrs is readonly. $listeners is readonly.

可能是加载了多个Vue实例导致&#xff0c;解决方法 vue.config.js chainWebpack: config > {config.resolve.alias.set(, resolve(src)).set(vue, resolve(./node_modules/vue))},然后重新运行项目即可

【.net core】【sqlsugar】联表查询与实体自动映射语法

官方文档&#xff1a;联表查询、关联查询、JoinTable、连表查询、Left Join - SqlSugar 5x - .NET果糖网 Join用法&#xff1a;语法糖2 Select 用法&#xff1a;自动映射 //类A 数据库字段与类成员一致 public class ClassA{//主键IDpublic int id{get;set;}//名称public st…

车内AR互动娱乐解决方案,打造沉浸式智能座舱体验

美摄科技凭借其卓越的创新能力&#xff0c;为企业带来了革命性的车内AR互动娱乐解决方案。该方案凭借自研的AI检测和渲染引擎&#xff0c;打造出逼真的数字形象&#xff0c;不仅丰富了车机娱乐内容&#xff0c;更提升了乘客与车辆的互动体验&#xff0c;让每一次出行都成为一场…

C语言 循环控制——while和do-while语句

目录 whiel语句 do-while语句 while与do-while的区别 计数控制的循环 ​编辑标记控制的循环 whiel语句 do-while语句 while与do-while的区别 计数控制的循环 标记控制的循环

怎么构建临床知识图谱?

怎么构建临床知识图谱? 构建临床知识图谱传统临床指南的局限性决策的不确定性和个体差异构建真实临床知识图谱构建真实世界的临床事件图谱基于书本抽取的知识来自哪些书本&#xff1f;如何保证这些知识是最新的知识&#xff1f;如何不断融入最新的医学研究进展&#xff0c;从而…

挖掘未来:私有LTE/5G网络驱动智慧矿山的自动化

私有LTE/5G网络为世界上一些最偏远的角落提供无线连接。如果没有无线通信网络&#xff0c;各行业就无法满足增加产量、降低运营成本和减少环境破坏的需求。 在本案例研究中&#xff0c;我们着眼于自动化如何改变无线网络的动态。智慧矿山要求运营商无缝集成多个系统和应用程序…

探索Web3的奇迹:数字时代的新前景

在数字化时代的潮流中&#xff0c;我们不可避免地迎来了一个全新的篇章——Web3时代的到来。在这个时代中&#xff0c;区块链技术作为数字化世界的核心&#xff0c;正在重塑着我们的生活方式、经济模式以及社会结构。在Web3时代&#xff0c;我们将目睹着一个以去中心化、透明化…

32.WEB渗透测试-数据传输与加解密(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;31.WEB渗透测试-数据传输与加解密&#xff08;5&#xff09; 关于discuz3.5的源码内容和…

LeetCode-Java:151.反转字符串当中的单词

文章目录 题目补充知识ArrayList动态数组StringBuilder类 解①穷举法②穷举法改进③双指针 题目 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单…

小型社区与园区如何选购合适的停车场道闸系统?需注意什么

小型社区和园区停车场通常面临着空间有限、预算有限以及车流量相对较小的挑战。这些特点要求停车场的管理系统既要经济实用&#xff0c;又要能够满足基本的车辆管理需求&#xff0c;如安全性、通行效率和便捷性。针对这些特点&#xff0c;选择合适的停车道闸系统成为提高管理效…

天诚物联网锁亮相福州南京沈阳西安展会,与您见证AIoT行业发展

目光灼灼&#xff0c;步履不辍。自4月1日第七届CCLE中国教育后勤展览会一别&#xff0c;全场景AIoT解决方案服务商——江苏新巢天诚智能技术有限公司&#xff08;以下简称“天诚”&#xff09;打造的校园物联网锁软硬一体化解决方案获得了诸多准意向代理商、集成商同仁们的咨询…

2011年认证杯SPSSPRO杯数学建模B题(第二阶段)生物多样性的评估全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 B题 生物多样性的评估 原题再现&#xff1a; 2010 年是联合国大会确定的国际生物多样性年。保护地球上的生物多样性已经越来越被人类社会所关注&#xff0c;相关的大规模科研和考察计划也层出不穷。为了更好地建立国际交流与专家间的合作&…

【网络安全】网络安全,你我同行——网络安全指南请查收~

网络是一把双刃剑&#xff0c;在给我们带来便捷生活的同时&#xff0c;也埋下了种种安全隐患。作为网络的亲身参与者&#xff0c;我们应该主动学习网络安全知识。快让我们一起来看看&#xff0c;本期安全小讲堂带来了哪些网络安全知识吧~ 01 常见网络安全隐患 网络安全问题无…

Docker镜像,什么是Docker镜像,Docker基本常用命令

docker镜像 1.1什么是镜像&#xff0c;镜像基础 1.1.1 镜像的简介 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境&#xff0c;具体来说镜像包含运行某个软件所需的所有内容&#xff0c;…