题目:你能求得第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; }
斐波那契优化 快速幂+矩阵乘法
时间: 2024-10-09 21:53:48