【POJ 3070】 Fibonacci

 

【题目链接】
           点击打开链接
【算法】

 

 

          矩阵乘法快速幂
【代码】

           

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
const long long MOD = 10000;

long long n;
struct Matrix
{
    long long n,m;
    long long mat[5][5];
} ans;

inline void multipy(Matrix &a,Matrix b)
{
    long long i,j,k;
    Matrix ans;
    ans.n = a.n; ans.m = b.m;
    memset(ans.mat,0,sizeof(ans.mat));
    for (i = 1; i <= a.n; i++)
    {
        for (j = 1; j <= b.m; j++)
        {
            for (k = 1; k <= a.m; k++)
            {
                ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
            }
        }
    }
    a = ans;
}

inline void power(Matrix &a,long long n)
{
    Matrix p,ans;
    p.n = p.m = 2;
    p.mat[1][1] = 1; p.mat[1][2] = 1;
    p.mat[2][1] = 1; p.mat[2][2] = 0;
    ans.n = ans.m = 2;
    ans.mat[1][1] = 1; ans.mat[1][2] = 0;
    ans.mat[2][1] = 0; ans.mat[2][2] = 1;
    while (n > 0)
    {
        if (n & 1) multipy(ans,p);
        n >>= 1;
        multipy(p,p);    
    }
    a = ans;
}

inline void solve()
{
    Matrix tmp; 
    tmp.n = 2; tmp.m = 1;
    tmp.mat[1][1] = 1; tmp.mat[2][1] = 0;
    ans.n = ans.m = 2;
    ans.mat[1][1] = ans.mat[1][2] = ans.mat[2][1] = 1;
    ans.mat[2][2] = 0;
    power(ans,n-1);
    multipy(ans,tmp);    
    cout<< ans.mat[1][1] << endl;
}

int main()
{
    
    while (scanf("%lld",&n) != EOF && n != -1)
    {
        if (!n) cout<< 0 << endl;
        else if (n == 1) cout<< 1 << endl;
        else solve();    
    }
    
    return 0;
}

 

posted @ 2018-05-23 22:40  evenbao  阅读(112)  评论(0编辑  收藏  举报