在遇到求很大位的斐波那契时,普通递归做法显然会比较慢,此处为矩阵快速幂做法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
struct matrix //定义结构体矩阵
{
ll x[2][2];
} ;
matrix mul(matrix a,matrix b) //矩阵乘法运算
{
matrix ans;
memset(ans.x,0,sizeof(ans.x));
for(int i=0;i<2;i++) //三个循环表示两个方阵相乘,可手动推写一遍
{
for(int j=0;j<2;j++)
{
for(int k=0;k<2;k++)
{
ans.x[i][j]+=a.x[i][k]*b.x[k][j];
ans.x[i][j]%=mod;
}
}
}
return ans;
}
matrix quickpow(matrix p,ll n) //矩阵快速幂,与快速幂道理方法相同
{
matrix ans;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
if(i==j){ans.x[i][j]=1;} //一开始初始化他为单位阵
else ans.x[i][j]=0;
}
}
while(n)
{
if(n&1)
{
ans=mul(ans,p);
}
p=mul(p,p);
n>>=1;
}
return ans;
}
int main()
{
matrix m;
m={0,1,1,1};
ll n;
cin>>n;
ll ans1=0;
matrix ans=quickpow(m,n-1);
cout<<ans.x[1][1]<<endl;
return 0;
}