Luogu 1962 斐波那契数列(矩阵,递推)

Description

大家都知道,斐波那契数列是满足如下性质的一个数列:

f(1) = 1

f(2) = 1

f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)

请你求出 f(n) mod 1000000007 的值。

Input

第 1 行:一个整数 n

Output

第 1 行: f(n) mod 1000000007 的值

Sample Input

5

Sample Output

5

Http

Luogu:https://www.luogu.org/problem/show?pid=1962

Source

递推,矩阵

解决思路

普通的斐波那契数列大家都懂,用递推方程一个一个递推就可以了,但是本题的数据范围巨大,若是用递推的方法肯定会超时,那么我们在这里介绍一下矩阵的方法。

关于矩阵的知识,请到我的这篇文章查看。

那么我们通过简单的推理可得矩阵递推方程:

\[F_i=F_{i-1}*T=\begin{bmatrix} f_{i-1} & f_{i-2} \\ 0& 0 \end{bmatrix}*\begin{bmatrix} 1 & 1 \\ 1 & 0\end{bmatrix}=\begin{bmatrix} f_i=f_{i-1}+f_{i-2} & f_{i-1} \\ 0 & 0 \end{bmatrix}
\]

那么剩余的部分就是矩阵快速幂来完成了。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; #define ll long long//注意用长整形,因为有可能会爆int const int Mod=1000000007;
const int inf=2147483647; class Matrix//定义矩阵
{
public:
ll M[2][2];
Matrix()
{
memset(M,0,sizeof(M));
}
Matrix(int Arr[2][2])//定义两个方便的矩阵初始化
{
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
M[i][j]=Arr[i][j];
}
}; Matrix operator * (Matrix A,Matrix B)//重载乘号操作
{
Matrix Ans;
for (int i=0;i<2;i++)
for (int j=0;j<2;j++)
for (int k=0;k<2;k++)
Ans.M[i][j]=(Ans.M[i][j]+A.M[i][k]*B.M[k][j]%Mod)%Mod;
return Ans;
} ll n; int main()
{
cin>>n;
if (n<=2)
{
cout<<1<<endl;
return 0;
}
n=n-2;
int a[2][2]={{1,1},{0,0}};//初始矩阵
int b[2][2]={{1,1},{1,0}};//即上文的T
Matrix A(a);
Matrix B(b);
while (n!=0)//快速幂
{
if (n&1)
A=A*B;
B=B*B;
n=n>>1;
}
cout<<A.M[0][0]<<endl;
return 0;
}

Luogu 1962 斐波那契数列(矩阵,递推)的更多相关文章

  1. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  2. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  3. Luogu P1962 斐波那契数列(矩阵乘法模板)

    传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...

  4. [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...

  5. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  6. HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

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

    1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 #include<stdio.h> #define mod 100000000 ...

  8. POJ3070 斐波那契数列 矩阵快速幂

    题目链接:http://poj.org/problem?id=3070 题意就是让你求斐波那契数列,不过n非常大,只能用logn的矩阵快速幂来做了 刚学完矩阵快速幂刷的水题,POJ不能用万能头文件是真 ...

  9. hdu4549 M斐波那契数列 矩阵快速幂+快速幂

    M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...

随机推荐

  1. React学习小结(三)

    一.React数据的传输 1.属性和状态是react中数据传递的载体 2.属性是声明以后不允许被修改的东西 3.属性只能在组件初始化的时候声明并传入组件内部,并且在组件内部通过this.props获取 ...

  2. undefined is not an object (evaluating 'RNFetchBlob.DocumentDir')

    参考https://github.com/wkh237/react-native-fetch-blob/issues/51 自己做了一下总结: 这个报错位置在react-native-fetch-bl ...

  3. getElementById和querySelector方法的区别

    "querySelector 属于 W3C 中的 Selectors API 规范 .而 getElementsBy 系列则属于 W3C 的 DOM 规范" 1.区别 getXXX ...

  4. centos5.5下mangodb启动报错glibc

    mangodb启动报错glibc找不到(centos5.5) 报错形式 [root@test-172-16-0-139-ip mongodb-server]# /data/mongodb-server ...

  5. PC版模块滚动不显示滚动条效果

    以前对某个模块增加无滚动条的滚动效果,还需要找个插件才能实现,现在发现个简单方法,用普通的CSS就可以实现. 此方法只适用于不显示滚动条的滚动效果,如果需要自定义滚动条样式,还是需要插件来实现. HT ...

  6. redhat 6.8 配置centos6的yum源

    1. 检查是否安装yum包[root@node1 rpms]# rpm -qa|grep yum 2. 删除自带的yum包[root@node1 rpms]# rpm -qa|grep yum|xar ...

  7. HTML特殊布局--------双飞翼布局

    今天看到以前写的一篇布局的例子分享给大家,双飞翼布局. 什么是双飞翼布局?? 1.三列布局,中间宽度自适应,两边固定宽度; 2.中间栏在浏览器中优先展示渲染: 双飞翼布局的原理: 中间的盒子定100% ...

  8. python list有关remove的问题

    在python 中进行一次简单的列表循环,当用到remove时出现了一个很有趣的现象, 代码如下: a=range(30) for i in a : if i%4!=0: a.remove(i) 这段 ...

  9. 详解ES6中的 let 和const

      前  言 JRedu ECMAScript 6 是 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性. ES6 与上一个版本 ES5 的所有不同之处,对涉及的语 ...

  10. angular.js小知识总结

    angular-watch.html 代码如下: <script> var app = angular.module('app',[]); app.controller('ctrl',fu ...