poj3070 Fibonacci 斐波那契数列的第n项的矩阵求法

对于满足( F 0  = 0,  F 1  = 1, and  Fn  =  Fn  − 1  +  Fn  − 2  for  n  ≥ 2)的斐波那契数列,第n项可由矩阵求出公式如下:

///2014.2.24
///poj3070

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

#define MOD 10000
//定义二阶矩阵
struct MATRIX
{
    long long f11;
    long long f12;
    long long f21;
    long long f22;
};

//定义二阶矩阵乘法函数
MATRIX matMulti(MATRIX mat1, MATRIX mat2)
{
    MATRIX matrix;
    matrix.f11 = (mat1.f11*mat2.f11 + mat1.f12*mat2.f21)%MOD;
    matrix.f12 = (mat1.f11*mat2.f12 + mat1.f12*mat2.f22)%MOD;
    matrix.f21 = (mat1.f21*mat2.f11 + mat1.f22*mat2.f21)%MOD;
    matrix.f22 = (mat1.f21*mat2.f12 + mat1.f22*mat2.f22)%MOD;

    return matrix;
}

MATRIX Fibo(int m)
{
    MATRIX unitMat,retMat;
    unitMat.f11 = (long long)1;
    unitMat.f12 = (long long)1;
    unitMat.f21 = (long long)1;
    unitMat.f22 = (long long)0;

    if(m==1)
    {
        retMat.f11 = (long long)1;
        retMat.f12 = (long long)1;
        retMat.f21 = (long long)1;
        retMat.f22 = (long long)0;
    }
    else if(m%2 == 0)
    {
        retMat = Fibo(m/2);
        retMat = matMulti(retMat,retMat);
    }
    else if(m%2 == 1)
    {
        retMat = Fibo((m-1)/2);
        retMat = matMulti(retMat,retMat);
        retMat = matMulti(retMat,unitMat);
    }

    return retMat;
}

int main()
{
//    freopen("in","r",stdin);
//    freopen("out","w",stdout);

    int m;
    vector<int> output;
    MATRIX retMatrix;

    while( cin>>m && m!=-1)
    {
        if(m==0)
        {
            output.push_back(0);
        }
        else
        {
            retMatrix = Fibo(m);
            output.push_back( retMatrix.f12 % 10000 );
        }
    }

    for(vector<int>::size_type i=0; i<output.size(); i++)
        cout<<output[i]<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值