• 洛谷 P1962 斐波那契数列


    题目背景

    大家都知道,斐波那契数列是满足如下性质的一个数列:

    • f(1) = 1

    • f(2) = 1

    • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数)

    题目描述

    请你求出 f(n) mod 1000000007 的值。

    输入输出格式

    输入格式:

     

    ·第 1 行:一个整数 n

     

    输出格式:

     

    第 1 行: f(n) mod 1000000007 的值

     

    输入输出样例

    输入样例#1:
    5
    输出样例#1:
    5
    输入样例#2:
    10
    输出样例#2:
    55

    说明

    对于 60% 的数据: n ≤ 92

    对于 100% 的数据: n在long long(INT64)范围内。

    题解:矩阵加速菲波那切

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    #define mod 1000000007LL
    using namespace std;
    
    LL n;
    
    struct matrix{
        LL t[120][120];
        matrix(){memset(t,0,sizeof(t));}
    }; 
    
    matrix mul(matrix a,matrix b){
        matrix res;
        for(int i=1;i<=2;i++){
            for(int j=1;j<=2;j++){
                for(int k=1;k<=2;k++){
                    res.t[i][j]=(res.t[i][j]%mod+a.t[i][k]*b.t[k][j]%mod)%mod;
                }
            }
        }
        return res;
    }
    
    matrix matrixksm(matrix a,LL k){
        k--;matrix ret=a;
        while(k){
            if(k&1)ret=mul(ret,a);
            a=mul(a,a);    
            k>>=1;
        }
        return ret;
    }
    
    int main(){
        scanf("%lld",&n);matrix ans,bas;
        if(n==0)printf("0
    ");
        else 
        if(n<=2)printf("1
    ");
        else {
            bas.t[1][1]=bas.t[2][1]=1;
            ans.t[1][1]=ans.t[1][2]=ans.t[2][1]=1;ans.t[2][2]=0;
            ans=matrixksm(ans,n-1);
            ans=mul(ans,bas);
            cout<<ans.t[2][1]<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    office 所有后缀对应的 content-type
    Vue 拖拽组件 vuedraggable 和 vue-dragging
    vue实现word,pdf文件的导出功能
    vue浏览器全屏实现
    对于js中事件冒泡的理解分析
    一个服务端的登录拦截
    ES6兼容ie9, flex兼容ie9
    webpack报错
    vue项目的一个package.json
    vue项目的构建过程
  • 原文地址:https://www.cnblogs.com/zzyh/p/7670939.html
Copyright © 2020-2023  润新知