P1962 斐波那契數列(矩陣加速DP)
阿新 • • 發佈:2020-08-19
題目背景
大家都知道,斐波那契數列是滿足如下性質的一個數列:
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(n≤2)Fn−1+Fn−2(n≥3)
題目描述
請你求出F_n \bmod 10^9 + 7Fnmod109+7的值。
輸入格式
一行一個正整數nn
輸出格式
輸出一行一個整數表示答案。
#include<bits/stdc++.h> using namespacestd; 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); }