这个简洁的求法其实是在做题的过程中发现的,但这道题的正规做法应该不是这样,所以我就先解释一下这种考找规律的斐波那契数列求法
事实上,只要细心观察,通过简单的数学推导很容易可以得到一个式子形如F(2n)=F(N)²+F(N+1)²就是F[N]=F[N/2]²+F[(N+1)/2]²
知道了这个式子后我们很容易的可以求出当目标为奇数时的递推关系(因为奇数本身除2自动约掉+1后除2即为n/2+1)但偶数会导致(N+1)/2自动约掉
n的大小一次可以减半,如果解决了偶数形式的问题我们就可以吧这一复杂度本来为2的n次方的递归问题优化为log2n性
于是我试着列了一个方程组如下图
在得出

可以解决这个问题

所以我们可以用log2n的递归完成对斐波那契的求解
下面我们看一下这个题的原题和题解

题目描述

Keven特别喜欢斐波那契数列,已知 fib1=1fib2​=1,对于 n>=3n>=3n>=3。fibn​=fibn−2​+fibn−1​,并且他想知道斐波那契前 n 项平方和是多少? 为了防止答案过大,请将最后的答案模 1e9+7
输入描述:
第一行一个整数 n(1<=n<=1e18)
输出描述:
在一行中输出斐波那契数列的前 n 项平方和模 1e9+7

问题就是求前n项斐波那契的平方和,可是这个题目的输入数据非常之大我们很难暴力枚举解决问题
这是我们借助一个图来作为辅助

我们可以发现所有项的平方和共同组成了大矩形的面积也就是F[N]*F[N+1]我们只要求出这两项的值即可。而这时我们发现如果按照传统递归来求,时间也不够用,所以我们就用上文提到的规律来解决问题(在这里提一下,本题的正确解法应该是求矩阵快速幂)问题分解后代码就变得非常简短了(map是因为数组会越界)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p = 1e9 + 7;
map<ll, ll>a;
ll n;
ll f(ll n)
{if (a[n] != 0)return a[n];ll t = n;n /= 2;if (t % 2)return a[t] = f(n) * f(n) % p + f(n + 1) * f(n + 1) % p;elsereturn a[t] = (2 * f(n - 1) % p + f(n) % p) * f(n) % p;
}
int main()
{cin >> n;a[1] = a[2] = 1;cout << f(n) % p * f(n + 1) % p << endl;return 0;
}

一个简洁的斐波那契求法和它的简单应用相关推荐

  1. 41【C#】斐波那契(Fibonacci)数列的第一个和第二个数分别为1和1 从第三个数开始,每个数等于其前两个数之和(1,1,2,3...)编写一个程序输出斐波那契数列中的前20个数,

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. E. 一个新的斐波那契数列

    题目描述 现在,有一个新的斐波那契数列, 定义如下: F(0) = 7 F(1) = 11 F(n) = F(n-1) + F(n-2) (n=>2) 输入 输入包含多组测试样例, 每组测试样例 ...

  3. 斐波那契数列的实现(简单递归和动态规划)

    斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using nam ...

  4. 找规律——一个新的斐波那契数列

    题目:Fibonacci Again 题目链接:Problem - 1021 (hdu.edu.cn) Problem Description There are another kind of Fi ...

  5. C语言习题——使一个数字变为斐波那契数的最小步数

    题目: 链接:Fibonacci数列__牛客网 来源:牛客网 Fibonacci数列是这样定义的: F[0] = 0 F[1] = 1 for each i ≥ 2: F[i] = F[i-1] + ...

  6. c语言编程斐波那契前n项,c语言:写一个函数,输入n,求斐波拉契数列的第n项(5种方法,层层优化)...

    写一个函数,输入n,求斐波拉契数列的第n项. 斐波拉契数列:1,1,2,3,5,8...,当n大于等于3时,后一项为前面两项之和. 解:方法1:从斐波拉契数列的函数定义角度编程 #include in ...

  7. 利用递归、迭代解决斐波那契数列问题与汉诺塔难题

    有人说,"普通程序员使用迭代,天才程序员使用递归",真是这样吗? 1.浅谈递归与迭代 <1>递归的基本概念: 程序调用自身的编程技巧称为递归,是函数自己调用自己. 一个 ...

  8. python实现连续数列相加_技术 | Python经典面试题解析实现斐波那契数列

    黑马程序员 微信号:heiniu526 传智播客旗下互联网资讯,学习资源免费分享平台 大家在面试过程中经常会考到斐波那契数列,斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一 ...

  9. 斐波那契算法举例(iterative Fibonacci algorithm)

    // count_change.cpp : Defines the entry point for the console application. // #include "stdafx. ...

最新文章

  1. 趋势科技全球首席安全官ED:人类迈向智能社会进程中不能失去掌控力
  2. 看我是如何利用升级系统一键GetShell
  3. 领结婚证了,新的人生开始了!
  4. c语言字符串转64位哈希值,对字符串进行hash处理用什么方法好???
  5. 飞畅科技-专业交换机厂家解读市场对工业交换机产品的要求有哪些?
  6. golang mysql大量连接_golang mysql 如何设置最大连接数和最大空闲连接数
  7. 实训项目四 powerpoint 综合应用_【深化改革结硕果】新疆番茄综合精深加工关键技术及产业化应用项目取得重大突破...
  8. 为什么越来越多的人喜欢旅游?
  9. 多线程依次打印abcabc
  10. Spring Boot 集成 WebSocket,轻松实现信息推送!
  11. Android用户界面 UI组件--AdapterView及其子类(一) ListView及各种Adapter详解
  12. apk编辑器android源码,apk编辑器电脑版_apk编辑器电脑版下载[apk编译]- 下载之家
  13. 20年管理学范围内知识点(潘永明)by:PoilZero
  14. 计算机管理磁盘管理,windows7双磁盘管理图文教程
  15. opcode是什么意思
  16. 顾连康复中心一个月费用?医保能报销吗
  17. EXCEL中怎样提取部分特定的文本?
  18. 安装系统时,硬盘格式转换
  19. 用u盘重装微软官方win10专业版--详细操作文档
  20. MATLAB中未定义函数或变量”的问题

热门文章

  1. vs2010 sp 1 下载
  2. 存储系统 - 存储网络的发展
  3. MFC 获取所有USB设备 列举所有USB设备 列举所有USB HUB
  4. 智慧物流车联网远程管理终端设备横向评估与优劣势对比
  5. feign.RetryableException: Connection refused (Connection refused) executing GET http://localhost:909
  6. 计算机暑期学校心得,暑期学校学习心得体会
  7. python苹果下载软件_PythonforMac官方下载_PythonforMac最新版_PythonforMac3.6.4官方最新版-华军软件园...
  8. 聪明是一种天赋,而善良是一种选择
  9. zookeeper连接,报caught end of stream exception EndOfStreamException: Unable to read additional data fro
  10. 解读阿里精准推广的核心算法