zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
     
  • 相关阅读:
    Linux下docker安装教程
    基于spark邮件自动分类
    多项式相关算法集成
    基于Bert的文本情感分类
    基于sklearn的分类器实战
    LDA && NCA: 降维与度量学习
    DataStream API介绍和示例
    Apache Flink 简单介绍和入门
    Hbase 表设计和高级属性
    hbase基础shell操作
  • 原文地址:https://www.cnblogs.com/zzyh/p/7670939.html
Copyright © 2011-2022 走看看