斐波那契数列(II)

题目链接:luogu P1962 / SSL 1529

题目大意

就是求斐波那契数列的某一项。

思路

这道题是矩阵乘法模板题。

一开始弄一个 1×21\times 21×2 的矩阵,表示斐波那契数列的两位:

1(F[n-2]) 1(F[n-1])

然后我们来看怎么让他移到下一位。
这个新的矩阵左边是由原来的右边构成,新的右边是由原来的左右两边加在一起构成。
那我们就可以乘这一个 2×22\times 22×2 的矩阵:

0 1
1 1

那我们要得到答案,其实就是把它挪动 n−1n-1n−1 次,然后要左边的那个值。
那就是乘 n−1n-1n−1 次上面这个 2×22\times 22×2 的矩阵。
那我们可以用矩阵快速幂来先求出所有 2×22\times 22×2 的矩阵乘起来是多少,然后再拿原来的乘这个乘完的 2×22\times 22×2 矩阵。

代码

不用重载运算符

#include<cstdio>
#include<cstring>
#define mo 1000000007
#define ll unsigned long longusing namespace std;ll n, ans[2][2] = {{1, 1}, {0, 0}}, a[2][2] = {{0, 1}, {1, 1}}, b[2][2], re[2][2];void times(ll x[2][2], ll y[2][2]) {memset(re, 0, sizeof(re));for (ll k = 0; k < 2; k++)for (ll i = 0; i < 2; i++)for (ll j = 0; j < 2; j++)re[i][j] = (re[i][j] + (x[i][k] * y[k][j]) % mo) % mo;for (ll i = 0; i < 2; i++)for (ll j = 0; j < 2; j++)b[i][j] = re[i][j];return ;
}void jzksm(ll now) {//矩阵快速幂if (!now) return ;if (now == 1) {for (ll i = 0; i < 2; i++)for (ll j = 0; j < 2; j++)b[i][j] = a[i][j];return ;}jzksm(now / 2);times(b, b);if (now & 1) times(b, a);return ;
}int main() {scanf("%lld", &n);if (n == 1) {//记得特判1printf("1");return 0;}jzksm(n - 1);times(ans, b);//记得ans一定要在左边(因为矩阵乘法位置不可以调换)printf("%lld", b[0][0]);return 0;
}

用重载运算符

#include<cstdio>
#include<cstring>
#define mo 10000
#define ll unsigned long longusing namespace std;struct matrix {ll n, m, a[5][5];
}a, b, ans;
ll n;matrix operator *(matrix x, matrix y) {matrix z;z.n = x.n;z.m = y.m;for (int i = 0; i < z.n; i++)for (int j = 0; j < z.m; j++)z.a[i][j] = 0;for (ll k = 0; k < x.m; k++)for (ll i = 0; i < z.n; i++)for (ll j = 0; j < z.m; j++)z.a[i][j] = (z.a[i][j] + (x.a[i][k] * y.a[k][j]) % mo) % mo;return z;
}void jzksm(ll now) {//矩阵快速幂if (!now) return ;if (now == 1) {b = a;return ;}jzksm(now / 2);b = b * b;if (now & 1) b = b * a;return ;
}int main() {scanf("%lld", &n);if (n == 1) {//记得特判1printf("1");return 0;}a.n = 2;a.m = 2;a.a[0][0] = 0;a.a[0][1] = 1;a.a[1][0] = 1;a.a[1][1] = 1;jzksm(n - 1);ans.n = 1;ans.m = 2;ans.a[0][0] = 1;ans.a[0][1] = 1;ans = ans * b;//记得ans一定要在左边(因为矩阵乘法位置不可以调换)printf("%lld", ans.a[0][0]);return 0;
}

斐波那契数列(II)相关推荐

  1. lintcode 949. 斐波那契数列 II

    lintcode 949. 斐波那契数列 II 1.题目 2.解题思路及lintcode python代码 3.进一步改进 1.题目 希望这是关于斐波那契数列终极一博. 2.解题思路及lintcode ...

  2. 动态规划——斐波那契数列(70. 爬楼梯、198. 打家劫舍、213. 打家劫舍II、信件错排、母牛生产)

    递归和动态规划都是将原问题拆分成多个子问题然后求解,但是动态规划存储了子问题的解,不需要重复计算. 动态规划(Dynamic Programming,DP)需要转移方程和边界条件. 目录 一.70. ...

  3. 斐波那契数列(大数)

    1216: 斐波那契数列 时间限制: 1 Sec  内存限制: 128 MB 点我 题目描述 Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n> ...

  4. 剑指 Offer 10- I. 斐波那契数列

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N)).斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...

  5. 1008day1:列表-字符串基础知识、正则提取字符串小数、python数据类型、判断为假的方法、格式判断if elif elif else、字符串遍、计算器、提取str字母、斐波那契数列、水仙花数

    文章目录 一.提取字符串里面的小数:正则 二.Python数据类型 三.== 字符串:str基础知识 == 四.整型及浮点型 五.判断为假的方法 六.判断格式 七.循环:字符串遍历 六.循环1~100 ...

  6. 斐波那契数列、素数、质数和猴子吃桃问题

    Contents 1. 什么是斐波那契数列.素数.质数和猴子吃桃问题? 1.1. 什么是斐波那契额数列 1.1.1. 构造螺旋曲线 1.1.2. 规则 1.1.3. 斐波那契数列中负数方向的构成 1. ...

  7. 矩阵快速幂及斐波那契数列

    1.通用模板:矩阵快速幂 前几天写过一篇矩阵快速幂的一种解法,但是当时只是初学,所以用了当时我更好理解的方法去做.那个解法需要调用两个很相像的函数,而且容易造成紊乱,也不利于矩阵快速幂的推广,所以在观 ...

  8. 经典兔子问题python视频_【Python】【demo实验14】【练习实例】【斐波那契数列】【经典兔子生小兔子问题】...

    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 每个月的兔子数量 1:2 2:2 3:4 2+2 4:6 ...

  9. 斐波那契数列在计算机的应用,斐波那契(Fibonacci)数列的几种计算机解法

    题目:斐波那契数列,又称黄金分割数列(F(n+1)/F(n)的极限是1:1.618,即黄金分割率),指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--.在数学上,斐波纳契数列以如下 ...

  10. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

最新文章

  1. java oom_Java中关于OOM的场景及解决方法
  2. Object C学习笔记22-#define 用法
  3. java实现自动收红包功能_Java实现抢红包功能
  4. CCIE学习(7)——VLAN相关命令汇总
  5. 算法学习——决策单调性优化DP
  6. Oracle中的USEREVN()
  7. 使用DbVisualizer导出DB2创建序列SQL
  8. 2091: [Poi2010]The Minima Game
  9. MIT大牛Gilbert Strang新书:《线性代数与从数据中学习》抢先看
  10. dhcp服务器批量修改ip租期,dhcp服务器的ip地址租期默认是多久
  11. 华为算法精英赛(题3:概率计算)
  12. OpenWrt加入iptables 支持过滤字符串
  13. 计算机的mac被交换机绑定,华为交换机绑定IP与MAC地址 -电脑资料
  14. 输出素数并统计个数--C语言
  15. react router 路由守卫_react实现路由守卫
  16. 基于FPGA的贪吃蛇游戏设计(1)整体架构设计
  17. win 10 把秘钥清掉之后查不到秘钥怎么办
  18. 【HTML5】HTML语法和基本常用标签(字符集)
  19. IDEA引用Class文件失败问题解决
  20. 快讯| RStudio Connect 发布

热门文章

  1. CAD组合成块,CAD合并成块,CAD炸开后再合并,CAD中炸开的图块合并在一起
  2. 吴恩达张潼接受WSJ采访:如何让AI像电力一样颠覆世界?
  3. 上位机PC控制UR3机器人实现方式
  4. 虚拟机搭建Harbor安装和简单使用
  5. android 使用流量监控,android流量监控
  6. asc超级计算机题目,ASC世界大学生超级计算机竞赛赛题:单张图像超分辨率
  7. 怎样在excel中画斜线
  8. 【Web_UI自动化_Python3_大众点评霸王餐_Seleniumpprint】(美团)大众点评霸王餐免费抽取,网址爬虫+自动报名,自动化测试案例
  9. 精密电阻(1%) -- 贴片电阻常用标示方法(转载)
  10. 宽带拨号找不到netcfg.hlp文件