2017.3.25 矩阵快速幂 求斐波那契数列第n项
来源:互联网 发布:周杰伦 忍者 知乎 编辑:程序博客网 时间:2024/06/06 23:18
对于矩阵快速幂只要知道矩阵取模、乘法原理就完全可以手推
口诀:行 列 被计算的行列的交点是结果对应的位置:
剩下的就是推矩阵:
其实根据矩阵的方程意义就很好推了:
码:
#include<iostream>#include<cstdio>using namespace std;#define ll long longstruct juzhen{ll hang,lie;ll jz[3][3];juzhen(){jz[0][0]=jz[0][1]=jz[1][1]=jz[1][2]=jz[2][1]=jz[1][0]=jz[2][2]=0;hang=0,lie=0;}};ll i,j,k;int n,p=999;juzhen jzcheng(juzhen a,juzhen b){ juzhen ans;ans.hang=a.hang;ans.lie=b.lie;for(int i=1;i<=ans.hang;i++){for(int j=1;j<=ans.lie;j++){for(int k=1;k<=ans.lie;k++){ans.jz[i][j]=(ans.jz[i][j]+(a.jz[i][k]*b.jz[k][j])%p)%p;} }}return ans;}void cheng(juzhen a,int b){for(int i=1;i<=a.hang;i++)for(int j=1;j<=a.lie;j++){a.jz[i][j]=(a.jz[i][j]*b)%p;}}juzhen jzkuai(juzhen a,int b){juzhen ans;ans.hang=a.hang;ans.lie=a.lie;ans.jz[2][2]=1;ans.jz[1][1]=1;ans.jz[1][2]=ans.jz[2][1]=0;while(b){ if(b&1){ ans=jzcheng(ans,a); }b/=2; a=jzcheng(a,a);}return ans;}int main(){scanf("%d%d",&n,&p);juzhen s1,s2;s1.hang=2;s1.lie=1;s1.jz[1][1]=1;s1.jz[2][1]=0;n--;s2.hang=2;s2.lie=2;s2.jz[1][1]=1;s2.jz[1][2]=1;s2.jz[2][1]=1;s2.jz[2][2]=0;juzhen daan=jzcheng(jzkuai(s2,n),s1);cout<<daan.jz[2][1]; }
0 0
- 2017.3.25 矩阵快速幂 求斐波那契数列第n项
- 矩阵快速模幂 + 求斐波那契数列第n项(Fibonacci)
- 矩阵快速幂求斐波那契数列第n项
- 51nod 1242 斐波那契数列的第N项(矩阵快速幂)
- 51nod 1242 斐波那契数列的第N项【矩阵快速幂】
- 51nod 1242 斐波那契数列的第N项 (矩阵快速幂)
- 【51Nod】1242 - 斐波那契数列的第N项(矩阵快速幂)
- 51nod 1242 斐波那契数列的第N项(矩阵快速幂)
- 51Nod-斐波那契数列的第N项(矩阵快速幂)
- 矩阵快速幂1242斐波那契数列的第N项
- 斐波那契数列的第N项 矩阵快速幂
- 1242 斐波那契数列的第N项(矩阵快速幂)
- 【51NOD1242】斐波那契数列的第N项(矩阵快速幂)
- [51NOD]-1242 斐波那契数列的第N项 [矩阵快速幂]
- 斐波那契数列的第N项(矩阵快速幂模板)
- 51 nod 1242 斐波那契数列的第N项 矩阵快速幂
- 51Nod 1242 斐波那契数列的第N项(矩阵快速幂)
- 1242 斐波那契数列的第N项(矩阵快速幂)
- gdb调试器的相关命令
- 配置小程序的艰辛历程
- 给定范围的二分法查找
- leetcode328~Odd Even Linked List
- JEB2 script 中通过api获取指定类的TypeHierarchy以遍历其所有派生类
- 2017.3.25 矩阵快速幂 求斐波那契数列第n项
- 计算糖果
- TreeView Xml
- <chapter one>浅谈Linux发行版
- linux 配置时钟服务器
- Linux FHS-文件系统层级结构标准简要说明
- 人脸识别关键点参考
- 更改root用户密码
- mysql 题目汇总