题目

Fibonacci 数列是非常著名的数列:

F[1] = 1,F[2] = 1,
对于 i > 3,F[i] = F[i − 1] + F[i − 2]

Fibonacci 数列有一个特殊的性质,前一项与后一项的比值,F[i]/F[i + 1], 会趋近于黄金分割。

为了验证这一性质,给定正整数 N,请你计算 F[N]/F[N + 1],并保留 8 位 小数。

输入
一个正整数 N。(1 ≤ N ≤ 2000000000)

输出
F[N]/F[N + 1]。答案保留 8 位小数。

样例输入

2

样例输出

0.50000000

解题思路

矩阵快速幂
快速幂常用于快速计算次数较大的乘方,比如题目 2088: 蓝桥杯算法提高VIP-快速幂。斐波那契数列最常用的方法就是矩阵快速幂,根据递推公式(矩阵具体构造过程请见矩阵构造方法)可以得到下式:
[ F ( N + 1 ) F ( N ) ] = [ F ( 2 ) F ( 1 ) ] ∗ A N + 1 − 2 \begin{aligned} [F(N+1)\quad F(N)]=[F(2)\quad F(1)]*{A}^{N+1-2} \end{aligned} [F(N+1)F(N)]=[F(2)F(1)]∗AN+1−2​由此,递推公式转换成了从已知的F(1)、F(2)直接经过乘方映射到了待求的F(N+1)、F(N)。对于一般的单个整数快速幂的模板如下:

long int(int n, int a){ //a^nlong int temp = 1;while (n){if (n&1)//二进制最后一位为1temp*=a;a*=a;n>>=1;//乘方次数除以2}return temp;
}

矩阵快速幂即将返回值、变量、乘法均换成与矩阵匹配的即可。

本题思路

回到本题,开始我用的是上述方法解题,但是发现N很大时,中间变量太大了,会超出long int范围而出错。之后打算先利用矩阵快速幂+矩阵乘法打表,N∈[1,50]的结果如下:

N=1 : 1.00000000
N=2 : 0.50000000
N=3 : 0.66666667
N=4 : 0.60000000
N=5 : 0.62500000
N=6 : 0.61538462
N=7 : 0.61904762
N=8 : 0.61764706
N=9 : 0.61818182
N=10 : 0.61797753
N=11 : 0.61805556
N=12 : 0.61802575
N=13 : 0.61803714
N=14 : 0.61803279
N=15 : 0.61803445
N=16 : 0.61803381
N=17 : 0.61803406
N=18 : 0.61803396
N=19 : 0.61803400
N=20 : 0.61803399
N=21 : 0.61803399
N=22 : 0.61803399
N=23 : 0.61803399
N=24 : 0.61803399
N=25 : 0.61803399
N=26 : 0.61803399
N=27 : 0.61803399
N=28 : 0.61803399
N=29 : 0.61803399
N=30 : 0.61803399
N=31 : 0.61803399
N=32 : 0.61803399
N=33 : 0.61803399
N=34 : 0.61803399
N=35 : 0.61803399
N=36 : 0.61803399
N=37 : 0.61803399
N=38 : 0.61803399
N=39 : 0.61803399
N=40 : 0.61803399
N=41 : 0.61803399
N=42 : 0.61803399
N=43 : 0.61803399
N=44 : 0.61803399
N=45 : 0.61803399
N=46 : -1.38720213
N=47 : -2.58263042
N=48 : -0.63185946
N=49 : 2.71635390
N=50 : 0.26908094

发现当N在46时,就已经发生了中间过程的数值越界,但是这不影响我们观察到,N>=20时,输出的值应该都是0.61803399,因此根据输入的N的值分为两类:一是N∈[1,20)时,直接运算;二是N>=20时,直接输出0.61803399

当然,本题数据量较小,更好的方法是:在N∈[1,20)时直接利用函数递推式进行计算;N>=20时直接输出0.61803399

代码

#include<bits/stdc++.h>
using namespace std;
struct Node{int a[2][2];
};struct Node fac;Node multiple(Node m1, Node m2){//结果存放在b中int i,j,k;struct Node b;for (i=0;i<2;i++){for (j=0;j<2;j++){b.a[i][j] = 0;//初始化for (k=0;k<2;k++)b.a[i][j]+= m1.a[i][k]*m2.a[k][j];}}return b;
}Node power(int k){int i,j;struct Node A,temp;for (i=0;i<2;i++)//初始化{for (j=0;j<2;j++){A.a[i][j] = (i==j)?1:0;//单位矩阵temp.a[i][j] = fac.a[i][j];}}while (k!=0){if (k&1)//最低位为1A = multiple(A,temp);temp = multiple(temp,temp);k>>=1;//除以二}return A;
}int main()
{int i,j,N;//(1 ≤ N ≤ 2000000000)int result[2],FF[i] = {1,1};//FF是已知的两个值scanf("%d",&N);struct Node f;fac.a[0][0] = 1,fac.a[0][1] = 1,fac.a[1][0] = 1,fac.a[1][1] = 0;//初始化if (N<20){f = power(N+1-2);//第二个乘数矩阵for (i=0;i<2;i++){result[i] = 0;for (j=0;j<2;j++)result[i] += FF[j]*f.a[j][i];}double r = result[1]*1.0/result[0];printf("%.8lf\n",r);}elseprintf("0.61803399");return 0;
}

题目 2311: 蓝桥杯2019年第十届省赛真题-Fibonacci 数列与黄金分割相关推荐

  1. 题目 2307: 蓝桥杯2019年第十届省赛真题-灵能传输

    题目 在游戏<星际争霸 II>中,高阶圣堂武士作为星灵的重要 AOE 单位,在 游戏的中后期发挥着重要的作用,其技能"灵能风暴"可以消耗大量的灵能对 一片区域内的敌军造 ...

  2. [蓝桥杯]2019年第十届省赛真题C/C++ B组 填空+大题

    第十届蓝桥杯省赛题目 填空A:组队 填空B:年号字串 填空C:数列求值 填空 D: 数的分解 填空 E: 迷宫 大题F:特别数的和 大题G:完全二叉树的权值 大题H:等差数列 大题I-后缀表达式 填空 ...

  3. 蓝桥杯2019年第十届国赛真题-大胖子走迷宫

    题目 题目链接 题解 BFS. 整体思路:将位置信息和时刻信息放入队列,根据时刻信息判断当前时刻小明的大小,如果大小为1×11×11×1则不能原地停留,因为没意义啊,停留是为了让自己的肚子减小,但是1 ...

  4. 蓝桥杯题目 2682: 蓝桥杯2022年第十三届省赛真题-GCD

    题目描述 给定两个不同的正整数 a, b,求一个正整数 k 使得 gcd(a + k, b + k) 尽可能大,其中 gcd(a, b) 表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满 ...

  5. 蓝桥杯2022年第十三届省赛真题-纸张尺寸

    题目描述 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁 ...

  6. 消除游戏——蓝桥杯2022年第十三届省赛真题

    题目描述 在一个字符串 S 中,如果 S i = S i−1 且S i 不等于S i−1,则称 S i 和 S i+1 为边缘字符.如果S i 不等于S i−1且 S i = S i+1,则 S i− ...

  7. 每日一题——质因数个数(蓝桥杯2022年第十三届省赛真题)

    如何将一个正整数分解质因数:每日一题--将一个正整数分解质因数_笨小古的博客-CSDN博客 题目描述:给定正整数 n,请问有多少个质数是 n 的约数. 输入格式:输入的第一行包含一个整数 n. 输出格 ...

  8. 蓝桥杯2022年第十三届省赛真题-选数异或

    题目描述 给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x . 输入 输 ...

  9. 蓝桥杯嵌入式STM32G431——第七届省赛真题模拟液位检测告警系统

    第七届省赛真题模拟液位检测告警系统 第七届省赛真题 主函数部分的代码功能实现(不包含各模块初始化代码) 第七届省赛真题 主函数部分的代码功能实现(不包含各模块初始化代码) #include " ...

最新文章

  1. TorchVision中使用FasterRCNN+ResNet50+FPN进行目标检测
  2. 抽点时间让我们一起来学linux系统
  3. SpringBoot 集成 Elasticsearch
  4. 开课吧python课程-明星为开课吧直播带货:人人都要学,人人都可以学的Python
  5. 【完结】16篇图像分类干货文章总结,从理论到实践全流程大盘点!
  6. Hiveduino编程电子积木平台产品介绍宣传视频
  7. pb 更改dropdwonlistbox绑定数据_Blazor 修仙之旅 组件与数据绑定
  8. 第五章 软件下载与安装(二、Ubuntu安装Mininet)
  9. nginx做grpc负载均衡时长连接或者短连接
  10. RecyclerView详细了解
  11. c#中的long类型示例_C#中带示例的无符号字节数组
  12. mysql5.7 mysql库下面的user表没有password字段无法修改密码
  13. [转载] python+opencv图像处理:numpy数组操作
  14. bzoj2436: [Noi2011]Noi嘉年华
  15. 创业阶段如何找客户_如何找创业合伙人
  16. 在ext4文件系统上恢复被误删除的文件
  17. 拼多多商品详情|多多进宝商品详情|拼多多商品详情接口
  18. 用python画一个机器猫歌词_Python实现海贼王的歌词组成词云图
  19. _GLIBCXX_USE_CXX11_ABI 定义不一致带来的宕机问题
  20. 抗D保 | 抗D宝 | 知道创宇云安全

热门文章

  1. Vue实现pptx在线预览
  2. 第四章货币的时间价值
  3. STM32-GPIO介绍
  4. 线上故障如何快速排查
  5. 京东数科 Mr.AI在未来生长
  6. 被裁员不要着急签字,教你3招,既能维护权益,还能获得赔偿金
  7. ecshop去所有版本+模板堂标记
  8. 计算一个数的各位数字平方和
  9. 323. 战略游戏 (树形dp)
  10. 白话空间统计二十四:地理加权回归(九)结果解读(二)