1. 程式人生 > 實用技巧 >P1962 斐波那契數列(矩陣加速DP)

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); }