其实直接递推就行了,但是由于一开始没看清范围还写了个矩阵快速幂,代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod=1e9+7;
struct matrix{
ll x,y;vector<vector<ll>> a;
matrix(ll w,ll h){
a.resize(w),x=w,y=h;
for(ll i=0;i<w;i++) a[i].resize(h);
}
friend matrix operator*(matrix a,matrix b){
matrix c(a.x,b.y);
for(ll i=0;i<c.x;i++){
for(ll j=0;j<c.y;j++){
for(ll k=0;k<a.y;k++){
c.a[i][j]+=a.a[i][k]*b.a[k][j]%mod;
c.a[i][j]%=mod;
}
}
}
return c;
}
}a(1,2),b(2,2);
matrix qpow(matrix s,matrix t,ll b){
matrix res=s;
while(b){
if(b&1){
res=res*t;
}
t=t*t,b>>=1;
}
return res;
}
int main(){
ll k;cin>>k;
if(k<=2){
cout<<1<<endl;
}else{
a.a[0][0]=a.a[0][1]=1;
b.a[0][0]=b.a[0][1]=b.a[1][0]=1,b.a[1][1]=0;
matrix ans=qpow(a,b,k-2);
cout<<ans.a[0][0]<<endl;
}
}

京公网安备 11010502036488号