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>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const ll mod=1e9+7;
    ll n;
    struct mat
    {
        ll m[6][6];
    }x,y;
    inline mat matmul(mat a,mat b,int len){
        mat res;
        for(int i=1;i<=2;++i)
        for(int j=1;j<=len;++j){
            res.m[i][j]=0;
            for(int k=1;k<=2;++k)
            res.m[i][j]=(res.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
        }
        return res;
    }
    mat matpow(mat a,ll p){
        mat res;
        for(int i=1;i<=2;++i)
        for(int j=1;j<=2;++j)
        for(int k=1;k<=2;++k)
        res.m[i][j]=a.m[i][j];
        for(ll i=p-1;i;i>>=1,a=matmul(a,a,2))
            if(i&1) res=matmul(res,a,2);
        return res;
    }
    int main()
    {
        scanf("%lld",&n);
        if(n<=2){printf("%d
    ",1); return 0;}
        x.m[1][1]=x.m[1][2]=x.m[2][1]=1;
        y.m[1][1]=y.m[2][1]=1;
        x=matpow(x,n-2);
        y=matmul(x,y,2);
        printf("%lld
    ",y.m[1][1]);
        return 0;
    }
    欢迎转载,转载请注明出处!
  • 相关阅读:
    cocoapods使用遇到的一些问题
    so
    UITextField的各种属性方法介绍
    <<第1章 初识JAVA>>
    《第16章 复习》
    《第17章 图书管理系统》
    《第15章 字符串》
    《第13章 猜拳游戏》
    《第14章 带参数的方法》
    《第12章 类的无参方法》
  • 原文地址:https://www.cnblogs.com/huihao/p/7684264.html
Copyright © 2011-2022 走看看