首页 > 代码库 > 斐波那契优化 快速幂+矩阵乘法

斐波那契优化 快速幂+矩阵乘法

 

题目:你能求得第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;}