zoukankan      html  css  js  c++  java
  • 斐波那契数列

    https://luogu.lohu.info/problem/show?pid=1962

    题目背景

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

    • 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)范围内。

    矩阵快速幂

    问题转化为求

    1  1   的 n-2 次方 (n>2)

    1  0

    #include<cstdio>
    #include<cstring>
    #define mod 1000000007
    using namespace std;
    long long a[3][3],ans[3][3],tmp[3][3];
    long long n;
    void mul(long long s1[3][3],long long s2[3][3])
    {
        memset(tmp,0,sizeof(tmp));
        for(int i=1;i<=2;i++)
         for(int j=1;j<=2;j++)
          for(int k=1;k<=2;k++)
           tmp[i][j]=(tmp[i][j]+s1[i][k]*s2[k][j])%mod;
        for(int i=1;i<=2;i++)
         for(int j=1;j<=2;j++)
          s1[i][j]=tmp[i][j];
    }
    void solve()
    {
        n-=2;
        for(;n;n>>=1,mul(a,a))
         if(n&1) mul(ans,a);
        printf("%lld
    ",ans[1][1]);
    }
    int main()
    {
            scanf("%lld",&n);
            if(n==0) 
            {
                printf("0
    ");
                return 0;
            }
            if(n==1||n==2) 
            {
                printf("1
    ");
                return 0;
            }
            a[1][1]=1;a[1][2]=1;
            a[2][1]=1;a[2][2]=0;
            ans[1][1]=1;ans[1][2]=1;
            ans[2][1]=1;ans[2][2]=0;
            solve();
    }
  • 相关阅读:
    python join的用法
    python json中的 dumps loads函数
    ubuntu 初始配置
    如何为ubuntu配置java环境
    Ubuntu系统如何安装软件
    取模与取余
    基本数据类型
    js面试题——作用域和闭包
    js面试题-原型和原型链
    js面试题-变量类型和计算
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/6625610.html
Copyright © 2011-2022 走看看