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;
    }
    欢迎转载,转载请注明出处!
  • 相关阅读:
    TcpClient连接帮助类
    winform中添加管理员权限控制
    textbox中输入email做格式控制
    绑定和非绑定方法
    类的封装、property、多态和多态性
    继承类之点点滴滴
    爬虫日记-正则表达式
    爬虫日记-单元总结
    爬虫日记-最好大学排名实例
    爬虫日记-第一单元总结
  • 原文地址:https://www.cnblogs.com/huihao/p/7684264.html
Copyright © 2011-2022 走看看