矩阵乘法模板:斐波那契数列第n项
记录模板
直接上矩阵乘法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#define r register
#define rep(i,x,y) for(r ll i=x;i<=y;++i)
#define per(i,x,y) for(r ll i=x;i>=y;--i)
using namespace std;
typedef long long ll;
const ll p=1e9+7;
ll n,answer;
struct node
{
ll a[4][4];
//ll x,y;
}v,ans;//ans 单位矩阵 v 递推矩阵
node operator *(const node &x,const node &y)
{
node c;
rep(i,1,2)
rep(j,1,2)
c.a[i][j]=0;
rep(i,1,2)
rep(j,1,2)
rep(k,1,2)
{
c.a[i][j]+=x.a[i][k]*y.a[k][j];
c.a[i][j]%=p;
}
return c;
}
void qpow(ll now)
{
while(now)
{
if(now&1) ans=ans*v;
v=v*v;
now>>=1;
}
}
void csh()
{
v.a[1][1]=v.a[1][2]=v.a[2][1]=1;
v.a[2][2]=0;
rep(i,1,2) ans.a[i][i]=1;
}
int main()
{
csh();
scanf("%lld",&n);
if(n<=2)
{
cout<<1;
return 0;
}
qpow(n-2);
answer=ans.a[1][1]+ans.a[2][1];
answer%=p;
cout<<answer ;
return 0;
}