码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-20 14:05:32      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   div   代码   

 

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

 

斐波那契优化 快速幂+矩阵乘法,布布扣,bubuko.com

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

标签:style   blog   color   os   io   for   div   代码   

原文地址:http://www.cnblogs.com/ltwy/p/3924400.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!