zoukankan      html  css  js  c++  java
  • 【历年真题】斐波那契数列logn做法

    描述

    【题解】


    用矩阵乘法加速递推
    [0 1]
    [1 1]
    *
    [f[n-1]]
    [f[n-2]]

    [f[n-1]]
    [f[n]]
    求A矩阵的n-2次幂然后再乘B矩阵。
    结果矩阵中的第二行第一列就是f[n]的结果了

    【代码】

    #include <cstdio>
    #include <cstring>
    #define ll long long
    using namespace std;
    const int N = 100;
    const long long MOD = 1e9+7;
    const int G = 2;
    
    struct abc{
        ll v[G+10][G+10];
        void print(){
            for (int i = 1;i <= G;i++)
            {
                for (int j = 1;j <= G;j++)
                    printf("%I64d ",v[i][j]);
                puts("");
            }
            puts("");
        }
        void E(){
            memset(v,0,sizeof v);
            for (int i = 1;i <= G;i++) v[i][i]=1;
        }
        void O(){
            memset(v,0,sizeof v);
        }
        abc operator * (const abc b) const{
            abc temp;temp.O();
            for (int i = 1;i <= G;i++)
                for (int j = 1;j <= G;j++){
                    ll sum = 0;
                    for (int k = 1;k<= G;k++){
                        sum=(sum+v[i][k]*b.v[k][j])%MOD;
                    }
                    temp.v[i][j] = sum;
                }
            return temp;
        }
    
        abc operator ^(int n)const{
            abc x;x.E();
            abc y;memcpy(y.v,v,sizeof(v));
            while (n>0){
                if (n&1) x=x*y;
                y = y*y;
                n/=2;
            }
            return x;
        }
    };
    
    abc a,b;
    int n;
    
    int main(){
        scanf("%d",&n);
        a.O();
        a.v[1][1] = 0;a.v[1][2] = 1;
        a.v[2][1] = 1;a.v[2][2] = 1;
        b.O();
        b.v[1][1] = 1;b.v[2][1] = 1;
        if (n<=2){
            printf("%d
    ",1);
        }else{
            a = a^(n-2);
            a = a*b;
            printf("%I64d
    ",a.v[2][1]);
        }
        return 0;
    }
    
    
  • 相关阅读:
    复利计算(1)
    对IT行业的一些思考
    递归下降语义分析
    1118 实验三 有限自动机的构造与识别
    冒泡排序文法评论
    实验0:了解和熟悉操作系统
    0302思考IT行业的感想
    递归下降语义分析
    对文法解释和语法树的评论
    语言文法
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11627373.html
Copyright © 2011-2022 走看看