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 (n≤2)Fn−1+Fn−2 (n≥3)
题目描述
请你求出 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); }