斐波那契数列(II)
斐波那契数列(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)相关推荐
- lintcode 949. 斐波那契数列 II
lintcode 949. 斐波那契数列 II 1.题目 2.解题思路及lintcode python代码 3.进一步改进 1.题目 希望这是关于斐波那契数列终极一博. 2.解题思路及lintcode ...
- 动态规划——斐波那契数列(70. 爬楼梯、198. 打家劫舍、213. 打家劫舍II、信件错排、母牛生产)
递归和动态规划都是将原问题拆分成多个子问题然后求解,但是动态规划存储了子问题的解,不需要重复计算. 动态规划(Dynamic Programming,DP)需要转移方程和边界条件. 目录 一.70. ...
- 斐波那契数列(大数)
1216: 斐波那契数列 时间限制: 1 Sec 内存限制: 128 MB 点我 题目描述 Fibonacci数列,定义如下: f(1)=f(2)=1 f(n)=f(n-1)+f(n-2) n> ...
- 剑指 Offer 10- I. 斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N)).斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - ...
- 1008day1:列表-字符串基础知识、正则提取字符串小数、python数据类型、判断为假的方法、格式判断if elif elif else、字符串遍、计算器、提取str字母、斐波那契数列、水仙花数
文章目录 一.提取字符串里面的小数:正则 二.Python数据类型 三.== 字符串:str基础知识 == 四.整型及浮点型 五.判断为假的方法 六.判断格式 七.循环:字符串遍历 六.循环1~100 ...
- 斐波那契数列、素数、质数和猴子吃桃问题
Contents 1. 什么是斐波那契数列.素数.质数和猴子吃桃问题? 1.1. 什么是斐波那契额数列 1.1.1. 构造螺旋曲线 1.1.2. 规则 1.1.3. 斐波那契数列中负数方向的构成 1. ...
- 矩阵快速幂及斐波那契数列
1.通用模板:矩阵快速幂 前几天写过一篇矩阵快速幂的一种解法,但是当时只是初学,所以用了当时我更好理解的方法去做.那个解法需要调用两个很相像的函数,而且容易造成紊乱,也不利于矩阵快速幂的推广,所以在观 ...
- 经典兔子问题python视频_【Python】【demo实验14】【练习实例】【斐波那契数列】【经典兔子生小兔子问题】...
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 每个月的兔子数量 1:2 2:2 3:4 2+2 4:6 ...
- 斐波那契数列在计算机的应用,斐波那契(Fibonacci)数列的几种计算机解法
题目:斐波那契数列,又称黄金分割数列(F(n+1)/F(n)的极限是1:1.618,即黄金分割率),指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.--.在数学上,斐波纳契数列以如下 ...
- java 斐波拉_Java实现斐波那契数列
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
最新文章
- java oom_Java中关于OOM的场景及解决方法
- Object C学习笔记22-#define 用法
- java实现自动收红包功能_Java实现抢红包功能
- CCIE学习(7)——VLAN相关命令汇总
- 算法学习——决策单调性优化DP
- Oracle中的USEREVN()
- 使用DbVisualizer导出DB2创建序列SQL
- 2091: [Poi2010]The Minima Game
- MIT大牛Gilbert Strang新书:《线性代数与从数据中学习》抢先看
- dhcp服务器批量修改ip租期,dhcp服务器的ip地址租期默认是多久
- 华为算法精英赛(题3:概率计算)
- OpenWrt加入iptables 支持过滤字符串
- 计算机的mac被交换机绑定,华为交换机绑定IP与MAC地址 -电脑资料
- 输出素数并统计个数--C语言
- react router 路由守卫_react实现路由守卫
- 基于FPGA的贪吃蛇游戏设计(1)整体架构设计
- win 10 把秘钥清掉之后查不到秘钥怎么办
- 【HTML5】HTML语法和基本常用标签(字符集)
- IDEA引用Class文件失败问题解决
- 快讯| RStudio Connect 发布
热门文章
- CAD组合成块,CAD合并成块,CAD炸开后再合并,CAD中炸开的图块合并在一起
- 吴恩达张潼接受WSJ采访:如何让AI像电力一样颠覆世界?
- 上位机PC控制UR3机器人实现方式
- 虚拟机搭建Harbor安装和简单使用
- android 使用流量监控,android流量监控
- asc超级计算机题目,ASC世界大学生超级计算机竞赛赛题:单张图像超分辨率
- 怎样在excel中画斜线
- 【Web_UI自动化_Python3_大众点评霸王餐_Seleniumpprint】(美团)大众点评霸王餐免费抽取,网址爬虫+自动报名,自动化测试案例
- 精密电阻(1%) -- 贴片电阻常用标示方法(转载)
- 宽带拨号找不到netcfg.hlp文件