zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    自动化测试成功11333
    自动化测试成功11222
    自动化测试成功1111
    自动化测试成功112
    自动化测试成功18
    自动化测试成功1
    自动化测试成功
    富文本测试
    关于VMware虚拟机磁盘收缩的几种方法
    8个让你更有效率的简单方法
  • 原文地址:https://www.cnblogs.com/evenbao/p/9196315.html
Copyright © 2011-2022 走看看