LuoguP1962 斐波那契数列 解题报告【矩阵快速幂】
来源:互联网 发布:js input name 数组 编辑:程序博客网 时间:2024/06/15 08:20
题目背景
大家都知道,斐波那契数列是满足如下性质的一个数列:
• f(1) = 1
• f(2) = 1
• f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)
题目描述
请你求出 f(n) mod 1000000007 的值。
输入输出格式
输入格式:
·第 1 行:一个整数 n
输出格式:
第 1 行: f(n) mod 1000000007 的值
输入输出样例
输入样例#1:
5
输出样例#1:
5
输入样例#2:
10
输出样例#2:
55
说明
对于 60% 的数据: n ≤ 92
对于 100% 的数据: n在long long(INT64)范围内。
解题报告
我们一看数据范围,n在long long范围内,看来就只能用矩阵快速幂了。
怎么用矩阵快速幂呢?
我们知道,
(转自这篇博客)
又因为
代码如下:
#include<cstdio>#include<cstring>#include<algorithm>#define ll long longusing namespace std;const int N=2,mod=1e9+7;struct mat{ ll c[N+5][N+5];};ll n;mat mat_mul(mat a,mat b){ mat ret; memset(ret.c,0,sizeof(ret.c)); for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) for(int k=1;k<=N;k++) ret.c[i][j]=(ret.c[i][j]%mod+a.c[i][k]*b.c[k][j]%mod)%mod; return ret;}ll mat_pow(){ mat base,ret; n-=2; memset(base.c,0,sizeof(base.c)); memset(ret.c,0,sizeof(ret.c)); base.c[1][2]=1,base.c[2][1]=1,base.c[1][1]=1; base.c[2][2]=0; ret.c[1][2]=1,ret.c[2][1]=1,ret.c[1][1]=1; ret.c[2][2]=0; for(ret;n;n>>=1,base=mat_mul(base,base))if(n&1)ret=mat_mul(ret,base); return ret.c[1][1];}int main(){ scanf("%lld",&n); if(n==0){printf("0");return 0;} if(n==1||n==2){printf("1");return 0;} printf("%lld\n",mat_pow()); return 0;}
阅读全文
0 0
- LuoguP1962 斐波那契数列 解题报告【矩阵快速幂】
- 解题报告:HDU4549 M斐波那契数列 数论三大基础(快速幂+矩阵快速幂+费马小定理)
- hdu3117(斐波那契数列+矩阵快速幂)
- 矩阵快速幂 斐波那契数列
- EOJ 1499 【斐波那契数列】【矩阵快速幂】
- hdu4549 M斐波那契数列(矩阵快速幂)
- hihoCoder1143 DP 斐波那契数列矩阵快速幂
- nod51-1242斐波那契数列-矩阵快速幂
- 斐波那契数列矩阵快速幂
- 斐波那契数列 打表+矩阵快速幂
- 【矩阵快速幂】 斐波那契数列求解。
- 斐波那契数列(矩阵快速幂)
- *矩阵快速幂(斐波那契数列模板)
- 矩阵快速幂(斐波那契数列)
- HDU4549 M斐波那契数列【矩阵快速幂】
- 斐波那契数列 (矩阵快速幂)
- 斐波那契数列 (矩阵快速幂)
- 矩阵快速幂--斐波那契数列
- 偷天换日(树形动态规划)
- UVA 1331Minimax Triangulation——最优三角剖分
- 【C#与.NET程序设计】(3)- C#基本参数类型
- #Linux Shell 脚本编程(10)—文本过滤(合并与分割—sort、uniq、join、cut、paste、split)
- word2vec初步了解
- LuoguP1962 斐波那契数列 解题报告【矩阵快速幂】
- lower_bound
- 能解开assetbundle格式资源的UnityStudio工具
- 最全的Android安全工具合集
- 安装linux开发板以及裸机程序烧写
- 安装MariaDB
- Linux Unit10
- 第一个只出现一次的字符 (剑指offer)
- 二叉树的深度遍历和广度遍历