题目分析


来源:acwing
分析:

先利用矩阵运算的性质将通项公式变成幂次形式,然后用快速幂的方法求解第 n项。

斐波那契数列的递推公式:f1=f2=1,fn=fn−2+fn−1(n≥3)f_1 = f_2 =1, f_n = f_{n-2} + f_{n-1}(n \geq3)f1​=f2​=1,fn​=fn−2​+fn−1​(n≥3)

定义向量 Fn=[fn,fn+1,Sn]F_n = [f_n, f_{n +1}, S_n]Fn​=[fn​,fn+1​,Sn​],其中fnf_{n }fn​和fn+1f_{n +1}fn+1​ 分别表示斐波那契数列的第n项和第n+1项,而且SnS_nSn​表示斐波那契数列的前n项和。则F1=[f1,f2,S1]=[1,1,1]F_1 = [f_1, f_{2}, S_1] =[1,1,1]F1​=[f1​,f2​,S1​]=[1,1,1]

我们要找到递推关系式,即找到 Fn+1=[fn+1,fn+2,Sn+1]F_{n+1} = [f_{n+1}, f_{n +2}, S_{n+1}]Fn+1​=[fn+1​,fn+2​,Sn+1​]和 Fn=[fn,fn+1,Sn]F_n = [f_n, f_{n +1}, S_n]Fn​=[fn​,fn+1​,Sn​]的关系

我们找到矩阵A=[010111001]A=\begin{bmatrix} 0 & 1 & 0\\ 1 & 1 & 1\\ 0& 0& 1 \\\end{bmatrix}A=⎣⎡​010​110​011​⎦⎤​
可以得到
[fn+1,fn+2,Sn+1]=[fn,fn+1,Sn][010111001][f_{n+1}, f_{n +2}, S_{n+1}] = [f_n, f_{n +1}, S_n]\begin{bmatrix} 0 & 1 & 0\\ 1 & 1 & 1\\ 0& 0& 1 \\\end{bmatrix}[fn+1​,fn+2​,Sn+1​]=[fn​,fn+1​,Sn​]⎣⎡​010​110​011​⎦⎤​

即:Fn+1=FnAF_{n+1} = F_{n}AFn+1​=Fn​A

所以:
Fn=F1An−1F_{n} = F_{1}A^{n-1}Fn​=F1​An−1

时间复杂度:快速幂的时间复杂度是 O(logn)O(logn)O(logn),所以本算法的时间复杂度也是O(logn)O(logn)O(logn)。

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 3;
typedef long long LL;int n, m;void mul(int c[], int a[], int b[][N]){int temp[N] = {0};for(int i = 0; i < N; i++)for(int j = 0; j < N; j++)temp[i] =  (temp[i]  + (LL) a[j] * b[j][i]) % m;memcpy(c, temp, sizeof temp);
}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;memcpy(c, temp, sizeof temp);
}int main(){cin >> n >> m;int f1[N] = {1, 1, 1};//f1, f2, s1int a[N][N] = {{0, 1, 0},{1, 1, 1},{0, 0, 1}};// f1 * a^(n-1)n --; // n变成n-1while(n){if( n & 1) mul(f1, f1, a); // f1 = f1 * a;mul(a, a, a); // a = a * a;n >>= 1; // n /= 2;}cout << f1[2] << endl;}

题目来源

https://www.acwing.com/problem/content/1305/

算法提高课-数学知识-矩阵乘法-AcWing 1303. 斐波那契前 n 项和:矩阵乘法,快速幂,线性代数相关推荐

  1. AcWing 1303. 斐波那契前 n 项和

    AcWing 1303. 斐波那契前 n 项和 题意: 题解: 这个题解分析的太到位了 代码: #include<iostream> #include<cstring>#def ...

  2. java求斐波那契前n项和_算法之斐波那契数列如何求第n个值与前n项和?(Java)...

    斐波那契数列 指的是这样一个数列:1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n& ...

  3. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)

    博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase) 转载自: http://tieba.baidu.com/p/1474319443 http://blog.sin ...

  4. 斐波那契数列(二)--矩阵优化算法

    之前写了一篇从斐波那契数列分析递归与动态规划(JAVA)来优化斐波那契数列,这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)=f(n-1)+f(n-2)求斐波那契数列的最 ...

  5. 求解斐波那契第n项的几种解法(含矩阵乘法+快速幂) Python实现

    斐波那契数列 首先我们来定义一下斐波那契数列: f(n)={0n = 01n = 1f(n−1)+f(n−2)n > 1f(n)= \begin{cases} 0 & \text {n ...

  6. 斐波那契数列三种实现+矩阵乘法+矩阵cimi

    package com.lyk.kk;/** * Created by Administrator on 2017/9/4. */ public class A1 {//矩阵乘法 public int ...

  7. Python数学计算工具3、Python 斐波那契数列-前500项列表

    百度解析: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  8. 洛谷——P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵(斐波那契数列)...

    P1775 古代人的难题_NOI导刊2010提高(02) P1936 水晶灯火灵 斐波那契数列 1.x,y∈[1-k],且x,y,k∈Z 2.(x^2-xy-y^2)^2=1 给你一个整数k,求一组满 ...

  9. 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

最新文章

  1. 解决toad中number类型小数位数过长按科学计数法显示的问题
  2. 23,148,855,308,184,500是一个神奇的数字,还是纯粹的机会?
  3. 基于PYQT编写一个人脸识别软件(2)
  4. 翻牌游戏如何打乱牌面java_剑仙登上虎牙封面C位,成为新的牌面,虎牙造星能力真的强...
  5. hdu_2227_Find the nondecreasing subsequences_树状数组,离散化
  6. 分析Linux磁盘管理与文件系统专题三
  7. Java中弹出对话框的方法
  8. Redis 实现接口访问频率限制
  9. 【DRP】【SQL】-悲观锁-防止多用户同时操作时出现脏数据
  10. MFC输出EXCEL文档的过程总结
  11. android audiorecord jni,Android AudioRecord初始化失败
  12. 亲宝伙伴ai早教机器人_伴随孩子成长的智能伙伴,聪聪AI陪伴教育机器人让学习更轻松!...
  13. UNIX环境高级编程之第5章:标准I/O库-习题
  14. python从入门到实践课后答案-Python编程:从入门到实践(课后习题8)
  15. pandas读取csv文件数据并对指定字段使用matplotlib画折线图
  16. python简单图片处理
  17. cad文件管理服务器,CAD文件管理(ZT)
  18. IM 产品设计思考(3) - 呼叫中心及IVR
  19. 【扫盲】Pulse消除马赛克(老司机福利)
  20. LockSupport 是什么?怎么用?

热门文章

  1. 左侧宽度固定,右侧宽度自适应-----两种布局样式
  2. leetcode题解:Search in Rotated Sorted Array(旋转排序数组查找)
  3. python根据一个基类生成派生类_将基类转换为派生类python(或者更像pythonic的扩展类的方式)...
  4. springboot oauth2登录成功处理器_Spring Boot Security 整合 OAuth2 设计安全API接口服务...
  5. 组合键 发送指定信号_Django signal 信号机制的使用
  6. 【Paper】2020_GrHDP Solution for Optimal Consensus Control of Multiagent Discrete-Time Systems
  7. 【Paper】2013_An efficient model predictive control scheme for an unmanned quadrotor helicopter
  8. 【UAV】高度控制代码分析
  9. Ubuntu12.10 root用户登录设置
  10. 那些年我们一起玩DIY总结出的经验——网络篇