Luogu 1962 斐波那契数列(矩阵,递推)
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
递推,矩阵
解决思路
普通的斐波那契数列大家都懂,用递推方程一个一个递推就可以了,但是本题的数据范围巨大,若是用递推的方法肯定会超时,那么我们在这里介绍一下矩阵的方法。
关于矩阵的知识,请到我的这篇文章查看。
那么我们通过简单的推理可得矩阵递推方程:
\]
那么剩余的部分就是矩阵快速幂来完成了。
代码
#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 斐波那契数列(矩阵,递推)的更多相关文章
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
- 斐波那契数列 矩阵乘法优化DP
斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007\),\(n\le 10^{18}\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...
- Luogu P1962 斐波那契数列(矩阵乘法模板)
传送门(其实就是求斐波那契数列....) 累了 明天再解释 做这道题需要一些关于矩阵乘法的基础知识. 1. 矩阵乘法的基础运算 只有当矩阵A的列数等于矩阵B的行数时,A与B可以相乘(A的行数不一定等于 ...
- [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数) 题目描述 请 ...
- 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]
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 ...
- POJ3070 斐波那契数列 矩阵快速幂
题目链接:http://poj.org/problem?id=3070 题意就是让你求斐波那契数列,不过n非常大,只能用logn的矩阵快速幂来做了 刚学完矩阵快速幂刷的水题,POJ不能用万能头文件是真 ...
- hdu4549 M斐波那契数列 矩阵快速幂+快速幂
M斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在给出a, b, n,你能求出F[n]的 ...
随机推荐
- Vue.js中组件传参的方法 - 基于webpack模板
在Vuejs中, 组件之间的传参是今天第一次接触, 之前写的组件互相之间都是独立的, 弗敢专也, 必以分人 环境: node.js npm vue-cli 以上安装请自行百度 一.项目创建 $ vue ...
- Mysql数据库二进制安装
MySQL数据库有四种安装方法: 源码包编译安装 RPM包安装 二进制文件安装 官方yum源安装 这里我们主要介绍二进制包的安装方法 在MySQL官网下载二进制包并且上传到服务器上 解压二进制包 [r ...
- 原生js实现图片网格式渐显、渐隐效果
写正文前先吐槽一下:端午放假完第一天去某千人以上公司面试前端工程师,第一轮是我应聘职位的部门小领导,谈的不错,面试主要围绕要用到的技术来:第二轮来了我要说的正主,我了个去,问的问题一个和前端无关,问我 ...
- hdu3715
hdu3715 题意 给出一个递归的伪代码,当 x[a[dep]] + x[b[dep]] != c[dep],就向下递归,给出a,b,c数组的值 问 dep 最大多少.其中 0 <= c[i] ...
- Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)
参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...
- 一天搞定CSS:字体font--04
1.字体体系 2.字体各属性取值 说明: 每一个属性后面的分支是属性值,以及对属性值的说明. 比如font-weight- - - -有两个取值:bold,normal 3.演示代码 <!DOC ...
- javaSE_06Java中的数组(array)-练习
(1),数组的两种遍历方式,顺序查找,二分查找,求最大最小数,冒泡排序,选择排序. public class Test1{ public static void main(String[] args) ...
- JSP/Servlet Web 学习笔记 DaySix —— EL表达式
1)EL从scope中得到参数时可以自动转换类型,因此对于类型转换的限制更加宽松. 2)使用EL表达式,可以简化变量和对象的访问. 3)EL表达式必须以 ${XXXX} 来表示. 4)EL提供点(.) ...
- nodejs中exports与module.exports的区别详细介绍
如果模块是一个特定的类型就用Module.exports.如果模块是一个典型的"实例化对象"就用exports. exports.name = function() { conso ...
- 抓包工具-Wireshark(详细介绍与TCP三次握手数据分析)
功能使用的详细介绍 wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封包,可以截取各种网络封包,显示网络封包的详细信息,包括http,TCP ...