首页 > 代码库 > 斐波那契优化 快速幂+矩阵乘法
斐波那契优化 快速幂+矩阵乘法
题目:你能求得第n个斐波那契数吗?0<n<maxlongint
由于结果太大,输出的结果mod32768
思路:一般的求斐波那契数列的方法有递归,动归,或者用滚动优化,但是空间复杂或者时间复杂度都太高了,现在有一种用矩阵加快速幂的优化算法,可以让时间复杂度维持在logn。
具体的 初始化一个2×2的矩阵,初始值为{1,0,0,1} 则分别代表{a2,a1,a1,a0},把此矩阵平方后得到{2,1,1,0}分别代表{a3,a2,a2,a1}如此下去,便可以得到规律,其实这个算法主要就是优化在快速幂上。至于矩阵则只是储存形式不同而已。
代码:
#include <iostream>using namespace std;//矩阵 struct Mta{ int a[2][2];};//矩阵相乘操作,a*b Mta mul(Mta a,Mta b){ Mta c; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { c.a[i][j] = 0; for(int k=0;k<2;k++) { c.a[i][j]+= (a.a[i][k]*b.a[k][j])%32768; } } } return c;}int main(){ int n; Mta res; Mta base; //求第n个斐波那契额数 while(cin>>n) { res.a[0][0] = 1; res.a[0][1] = 0; res.a[1][0] = 0; res.a[1][1] = 1; base.a[0][0] = 1; base.a[0][1] = 1; base.a[1][0] = 1; base.a[1][1] = 0; //矩阵快速幂 while(n!=0) { if(n&1) { res = mul(res,base); } base = mul(base,base); n /= 2; } cout<<res.a[0][1]<<endl;} return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。