P1962 斐波那契数列(矩阵加速DP)

题目背景

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

F_n = \left\{\begin{aligned} 1 \space (n \le 2) \\ F_{n-1}+F_{n-2} \space (n\ge 3) \end{aligned}\right.Fn={1 (n2)Fn1+Fn2 (n3)

题目描述

请你求出 F_n \bmod 10^9 + 7Fnmod109+7 的值。

输入格式

一行一个正整数 nn

输出格式

输出一行一个整数表示答案。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
typedef long long ll;
const int mod=1e9+7;
int t;
ll n;
struct matrix {
    ll m[5][5];
}ans,base;
void init () {
    memset(ans.m,0,sizeof(ans.m));
    for (int i=1;i<=2;i++) ans.m[i][i]=1;
    memset(base.m,0,sizeof(base.m)); 
    base.m[1][1]=1;
    base.m[1][2]=1;
    base.m[2][1]=1;
} 
matrix mul (matrix a,matrix b) {
    matrix wjm;
    memset(wjm.m,0,sizeof(wjm.m));
    for (int i=1;i<=2;i++)
        for (int j=1;j<=2;j++)
            for (int k=1;k<=2;k++)
                wjm.m[i][j]=(wjm.m[i][j]+(a.m[i][k]%mod)*(b.m[k][j]%mod)%mod)%mod;
    return wjm;
}
void qpow (ll p) {
    while (p) {
        if (p&1) ans=mul(ans,base);
        base=mul(base,base);
        p>>=1;
    }
}
int main () {
    scanf("%lld",&n);
    if (n<=2)
        return printf("1\n"),0; 
    init();
    qpow(n);
    printf("%lld\n",(ans.m[1][2]+mod)%mod);
}

 

posted @ 2020-08-19 21:36  zlc0405  阅读(195)  评论(0编辑  收藏  举报