学了矩阵,练一下手。。。
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=1e9+7;
using namespace std;
struct Matrix{
ll g[3][3];
Matrix() {
memset(g,0,sizeof(g));
}//矩阵初始化为0
Matrix operator *(const Matrix &b) const{//重载乘号
Matrix res;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
res.g[i][k]=(res.g[i][k]+g[i][j]*b.g[j][k]%mod)%mod;
return res;
}
}a,ans;
void init(){
a.g[1][1]=1,a.g[1][2]=1,a.g[2][1]=1;
ans.g[1][1]=ans.g[1][2]=1;
}
void qpow(ll x){//矩阵快速幂
while(x){
if(x&1) ans=ans*a;
a=a*a;
x>>=1;
}
}
int main(){
ll n;
cin>>n;
if(n<=2){
cout<<1;
return 0;
}
init();
qpow(n-2);
cout<<ans.g[1][1]%mod;
return 0;
}
//没开long long始终都过不了的数据
//65748392011234567 in
//188363182 out