前言

是的,没错,斐波那契数列除了递推、递归算法之外,还有更加高效的求解方法,那就是矩阵运算+快速幂。

思路:
可以先利用矩阵运算的性质将通项公式变成幂次形式,然后用平方倍增(快速幂)的方法求解第 n 项。

首先我们定义向量
Xn=[an an−1],边界:X1=[a1 a0]
然后我们可以找出矩阵:
A=[1110]A=\left[ \begin{matrix} 1 & 1 \\ 1& 0 \end{matrix} \right] A=[11​10​]
则有:
Xn=Xn−1×A
所以:
Xn=X1×An−1
由于矩阵具有结合律,所以我们可以先求出 An−1%P,然后再用 X1左乘,即可求出 Xn,向量 Xn 的第一个元素就是 an

具体实现:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <ctime>using namespace std;const int MOD = 1000000007;void mul(int a[][2], int b[][2], int c[][2])
{int temp[][2] = {{0, 0}, {0, 0}};for (int i = 0; i < 2; i ++ )for (int j = 0; j < 2; j ++ )for (int k = 0; k < 2; k ++ ){long long x = temp[i][j] + (long long)a[i][k] * b[k][j];temp[i][j] = x % MOD;}for (int i = 0; i < 2; i ++ )for (int j = 0; j < 2; j ++ )c[i][j] = temp[i][j];
}int f_final(long long n)
{int x[2] = {1, 1};int res[][2] = {{1, 0}, {0, 1}};int t[][2] = {{1, 1}, {1, 0}};long long k = n - 1;while (k){if (k&1) mul(res, t, res);mul(t, t, t);k >>= 1;}int c[2] = {0, 0};for (int i = 0; i < 2; i ++ )for (int j = 0; j < 2; j ++ ){long long r = c[i] + (long long)x[j] * res[j][i];c[i] = r % MOD;}return c[0];
}int main()
{long long n ;cin >> n;cout << f_final(n) << endl;return 0;
}

说明:
参考y总的总结
链接:https://www.acwing.com/blog/content/25/
来源:AcWing

斐波那契数列O(logn)的求解方法相关推荐

  1. c++调用cplex求解例子_递归算法的R语言实现 (罗汉塔、九连环、斐波那契数列等问题的求解)...

    递归算法用函数来实现,通俗地说就是函数对自身的调用,求解递归问题就转化为函数的调用关系问题.函数f(n)随自变量n的增加而变化,函数的调用关系也就表现为f(n)与f(n-1)或f(n-2)关系的问题. ...

  2. 斐波那契数列的背景及解决方法

    斐波那契数列的背景及解决方法 背景: 前两天看到一道很有意思的数学题 假定你有一雄一雌一对刚出生的兔子,它们在长到一个月大小时开始交配,在第二月结束时,雌兔子产下另一对兔子,过了一个月后它们也开始繁殖 ...

  3. 精益求精——斐波那契数列的logn解法

    14天阅读挑战赛 努力是为了不平庸~ 缘起:兔子数列 斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89... 这个数列从第3项开始,每一项都等于前两项之和.它因数学 ...

  4. 求斐波那契数列O(logn算法)

    矩阵递推关系 学过代数的人可以看出,下面这个式子是成立的: 不停地利用这个式子迭代右边的列向量,会得到下面的式子: 这样,问题就转化为如何计算这个矩阵的n次方了,可以采用快速幂的方法. 快速幂_百度百 ...

  5. 斐波拉契数列的三种实现方法

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

  6. 斐波那契数列时间复杂度Logn的算法

    矩阵分解 class Solution {static final int MOD = 1000000007;public int fib(int n) {if (n < 2) {return ...

  7. 斐波那契数列通项公式的几种方法

    1.递归 2.动态规划 3.矩阵快速幂 转载于:https://www.cnblogs.com/umrx/p/8145954.html

  8. 【斐波那契数列通项公式求解】

    斐波那契数列,又称黄金分割数列,数学家莱昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为"兔子数列",该数列在数学上定义为 前几项为: 1,1,2,3,5,8,13,21,34 斐 ...

  9. 求解斐波那契数列(Fibonacci Numbers)算法居然有9种,你知道哪几种吗?

    By LongLuo 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&q ...

最新文章

  1. 2019年,比特币现金爱好者线下见面会发展至6大洲30个国家
  2. 【转】CEC文件详解
  3. 查看.Net程序的框架版本的方法
  4. 上海的互联网数据中心“一柜难求
  5. python天天向上每十天休息一天_Python基础第十天
  6. Learn day4 函数参数\变量\闭包\递归
  7. 如何绘制逻辑图 — 1. 逻辑图构成的三元素
  8. 拆分器SplitContainer控件
  9. 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
  10. devops+备份mysql_使用Xtrabackup备份 MySQL 数据库
  11. JavaScript的数据类型及其检测
  12. linux下gcc/g++命令
  13. Mac下一款好用的UML图绘制工具(StarUML)
  14. 使用python实现简单网页图片抓取
  15. ye321片库_jQuery的简约幻灯片库
  16. 量子计算机能为我们做什么,为实现量子计算,我们还需要做些什么
  17. 页面静态化----------------------------------------个人笔记
  18. 算数右移逻辑右移java的表示_java的算术右移()与逻辑右移()
  19. Cesium中的相机—HeadingPitchRoll
  20. 我就问你,半路接手嵌入式项目棘手不?

热门文章

  1. pytorch官方教程中文版(二)学习PyTorch
  2. java实现短信验证【秒嘀云】
  3. 送5本刚出版的Flink实战书籍!
  4. 【题解】LuoGu2161: [SHOI2009]会场预约
  5. 计算机美术教学应用,计算机辅助美术教学应用
  6. AI渗透短视频赛道:只需一个提示词,文本影像画外音一键搞定
  7. 揭秘史上最昂贵的一行Javascript代码
  8. 不能以“一时一事”来衡量转型,灿谷的方向是对的
  9. 处理表中id字段中,序号顺序不连贯
  10. oracle查询结果时间格式转换由日月年改为年月日