【洛谷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;
}
欢迎转载,转载请注明出处!
原文地址:https://www.cnblogs.com/huihao/p/7684264.html