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

题目背景

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

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

题目描述

请你求出 F_n mod 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
"),0; 
    init();
    qpow(n);
    printf("%lld
",(ans.m[1][2]+mod)%mod);
}
原文地址:https://www.cnblogs.com/zhanglichen/p/13532091.html