Fibonacci 矩阵快速幂

这道题就是一道裸的矩阵快速幂,矩阵快速幂在求解递归问题上效率非常高,可将线性的时间复杂度降为O(log(n)),大大降低了程序的运行时间。

构造的矩阵为  [1     1]  这样就可以求出最后的结果了,结果每次取模,就得到了最终的结果。  

  [1     0]


//Fibonacci matrixquickpow
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL ;
typedef vector<int> vec;
typedef vector<vec> mat;
const int MOD = 10000;
mat mul(mat a, mat b)
{
    mat c(a.size(), vec(b[0].size()));
    for(int i=0; i<a.size(); i++)
        for(int j=0; j<b[0].size(); j++)
        {
            c[i][j] = 0;
            for(int k=0; k<a[0].size(); k++)
                c[i][j] = (c[i][j] + a[i][k] * b[k][j])%MOD;
        }
    return c;
}
mat matrix_quickpow(mat input, int n)
{
    mat result(input.size(), vec(input[0].size()));
    for(int i=0; i<input.size(); i++)
        for(int j=0; j<input[0].size(); j++)
            if(i == j)
                result[i][j] = 1;
            else
                result[i][j] = 0;
    while(n)
    {
        if(n&1)
            result = mul(result, input);
        input = mul(input, input);
        n >>= 1;
    }
    return result;
}
int main()
{
    int n;
    while(cin>>n)
    {
        if(n == -1)
            break;
        mat init(2, vec(2));
        init[0][0] = 1;
        init[0][1] = 1;
        init[1][0] = 1;
        init[1][1] = 0;
        mat result = matrix_quickpow(init, n);
        cout<<result[1][0]<<endl;
    }
    return 0;
}


你可能感兴趣的:(Algorithm,mathematical)