【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导
来提供两个正确的做法:
- 斐波那契数列双倍项的做法(附加证明)
- 矩阵快速幂
一、双倍项做法
在偶然之中,在百度中翻到了有关于斐波那契数列的词条(传送门),那么我们可以发现一个这个规律$ \frac{F_{2n}}{F_{n}}=F_{n-1}+F_{n+1} $,那么我就想到了是不是可以用这个公式实现类似于快速幂之类的东西:power(n,m)=power(n*n,m/2) m mod 2=0 power(n,m)=power(n*n,m/2)*n m mod 2=1
快速幂这个东西,是分成偶数情况和奇数情况,所以我们只是知道偶数想的计算公式,所以我们接下来要推导一下奇数项的递归式
\]
\]
那么我们就是要从\(F_{2n}\)和\(F_{2n+2}\)推导求出\(F_{2n+1}\)
\]
\]
\]
\]
\]
\]
以上就是我们对于这个公式的推导
那么我们就得到了
**F[2n] = F[n+1]² - F[n-1]² = (2F[n-1] + F[n]) · F[n] **
F[2n+1] = F[n+1]² + F[n]²
那么,我们在写一个map,那么就可以不用全部都递归到底了,优化一下。
用map映射一下大数,映射到我们的答案上。
#include <bits/stdc++.h>
using namespace std;
const int Mod=1e9+7;//mod数
long long n;
map<long long,long long> ma;//搞映射
inline long long work(long long x){
if(x==1||x==0)return 1;//边界
if(ma.count(x))return ma[x];//count如果是返回1那么就是这个答案已经在map中映射过了,0就是没有
long long res=0,t=x/2;
if(x&1) res=work(t)*(work(t-1)+work(t+1))%Mod;//公式2
else res=work(t)*work(t)%Mod+work(t-1)*work(t-1)%Mod;//公式1
return ma[x]=res;
}
int main() {//主程序
cin>>n;
long long res=work(n-1)%Mod;
cout<<res<<endl;
return 0;
}
注:这个程序的复杂度是也差不多是log(n),也是非常优的解法
二、矩阵乘法解法
这个解法应该是这一道题的正解。
我是一个蒟蒻,还是只是初懂矩阵乘法的小白。
我就贴一下自己的代码,详细的题解还是看一下别的大佬的题解。
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007 //Mod数
struct Matrix{//这个是矩阵的结构体
long long ma[2][2];
};
Matrix mul(Matrix A,Matrix B)//矩阵乘法
{
Matrix C;//答案矩阵
C.ma[0][0]=C.ma[0][1]=C.ma[1][0]=C.ma[1][1]=0;//初始化
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
C.ma[i][j]=(C.ma[i][j]+A.ma[i][k]*B.ma[k][j])%mod;
}
}
}
return C;
}
Matrix pow_mod(Matrix A,long long n)//卡苏米+矩阵乘法优化
{
Matrix B;
B.ma[0][0]=B.ma[1][1]=1;
B.ma[0][1]=B.ma[1][0]=0;
while(n) {
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main()
{
long long n;
Matrix A;
A.ma[0][0]=1;A.ma[0][1]=1;
A.ma[1][0]=1;A.ma[1][1]=0;//初始的数组
Matrix ans=pow_mod(A,n);
printf("%lld\n",ans.ma[0][1]);//输出答案
return 0;
}
注:关于矩阵乘法加速,这个矩阵有多种写法,这个只是其中的一种,不需要纠结于矩阵是否唯一。
【洛谷P1962 斐波那契数列】矩阵快速幂+数学推导的更多相关文章
- 洛谷P1962 斐波那契数列(矩阵快速幂)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- 洛谷- P1306 斐波那契公约数 - 矩阵快速幂 斐波那契性质
P1306 斐波那契公约数:https://www.luogu.org/problemnew/show/P1306 这道题目就是求第n项和第m项的斐波那契数字,然后让这两个数求GCD,输出答案的后8位 ...
- 洛谷P1962 斐波那契数列【矩阵运算】
洛谷P1962 斐波那契数列[矩阵运算] 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) ( ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...
- 洛谷——P1962 斐波那契数列
P1962 斐波那契数列 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 ...
- 洛谷—— P1962 斐波那契数列
https://www.luogu.org/problem/show?pid=1962 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f ...
- 洛谷P1962 斐波那契数列题解
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理
M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Sub ...
- 51nod1242 斐波那契数列 矩阵快速幂
1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 #include<stdio.h> #define mod 100000000 ...
随机推荐
- 【SQLite】教程09-VBA读取SQLite数据之ODBC,及中文乱码问题
VBA使用ODBC Driver for SQLite读SQLite 如下图有这么一个SQlite数据库,我们要读取它 需要先安装ODBC,可以从这里下载: SQLite 3 ODBC Driver ...
- 618技术特辑(三)直播带货王,“OMG买它”的背后,为什么是一连串技术挑战?
[本期推荐]为什么一到大促,我们的钱包总是被掏空?是大家自制力不够,还是电商平台太会读懂人心,从技术维度,抽丝剥茧一探究竟. 摘要:动辄几十上百万人同时在线的直播间,让所有人能同时公平的去抢购,并且还 ...
- SpringCloud(1)生态与简绍
一:微服务架构简绍学习目标 1.技术架构的演变,怎么一步步到微服务的:2.什么是微服务,优点与缺点 :3.SOA(面向服务)与MicroServices(微服务)的区别 :4.Dubbo 与Spri ...
- 搭建 MySQL 高可用高性能集群
什么是MySQL集群,什么是MySQL集群,如果你想知道什么是MySQL集群,我现在就带你研究. MySQL 是一款流行的轻量级数据库,很多应用都是使用它作为数据存储.作为小型应用的数据库,它完全可以 ...
- SQL 查询语句总是先执行 SELECT?你们都错了
很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函数 ...
- [apue] linux 文件访问权限那些事儿
前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...
- redHat6设置ip地址
产生需求的原因: 最近新安装了redhat6,可是在相互ping的过程中发现redhat6的并没有配置静态的ip地址,于是我尝试使用windows的方式去配置,可效果并不如意,于是如何在redhat6 ...
- 关于kubernetes的十七个实验(一)
实验综述 Kubernetes用来管理云平台上的容器化应用,这里从 https://www.katacoda.com/courses/kubernetes 学习Kubernetes的使用,对Kuber ...
- Spring Cloud Data Flow整合UAA之使用LDAP进行账号管理
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 前言 Spring Cloud Data Flow整合UAA的文章已经写了两篇,之前的方案是把用户信息保存在数据库中: ...
- MySQL:一条SQL是如何执行的
目录 MySQL基本架构 Server层 连接器 查询缓存 分析器 优化器 执行器 存储引擎层 InnoDB MyISAM Memory SQL执行流程 MySQL基本架构 在讲SQL语句是如何执行之 ...