• SDNU 1062.Fibonacci(矩阵快速幂)


    Description

    In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2.

    Input

    a single line containing n (where 0 ≤ n ≤ 100,000,000,000)

    Output

    print Fn mod 1000000007 in a single line.

    Sample Input

    99999999999

    Sample Output

    669753982

    Hint

    An alternative formula for the Fibonacci sequence is


    As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by


    Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

    Source

    Unknown
    思路:一开始想着要暴力的办法,或者用python,但还是tle了,然后发现这玩意儿可以用矩阵快速幂,就来一波骚操作了。
    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define eps 1e-9
    #define pi acos(-1)
    
    const int inf = 0x3f3f3f3f;
    const int mod = 1000000007;
    const int maxn = 1000 + 8;
    
    ll n;
    
    struct matrix
    {
        ll m[2][2];
    }b, tp, res, init;
    
    matrix mul(matrix a, matrix b)
    {
        matrix c;
        for(int i = 0; i < 2; i++)
        {
            for(int j = 0; j < 2; j++)
            {
                c.m[i][j] = 0;
                for(int k = 0; k < 2; k++)
                {
                    c.m[i][j] += (a.m[i][k] * b.m[k][j]) % mod;
                    c.m[i][j] %= mod;
                }
            }
        }
        return c;
    }
    
    matrix matrix_mi(matrix p, ll k)
    {
        matrix t = res;
        while(k)
        {
            if(k & 1)
                t = mul(t, p);
            k >>= 1;
            p = mul(p, p);
        }
        return t;
    }
    
    int main()
    {
        std::ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        for(int i = 0; i < 2; i++)
            for(int j = 0; j < 2; j++)
            {
                if(i == 1 && j == 1)
                    init.m[i][j] = 0;
                else
                    init.m[i][j] = 1;
            }
        cin >> n;
        b = init;
        for(int i = 0; i < 2; i++)
            for(int j = 0; j < 2; j++)
                if(i == j)
                    res.m[i][j] = 1;
                else
                    res.m[i][j] = 0;
        tp = matrix_mi(b, n);
        cout << tp.m[0][1] <<'
    ';
        return 0;
    }
  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/RootVount/p/11469372.html
Copyright © 2020-2023  润新知