斐波那契数列加强版

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MOD = 1e9 + 7;
ll n;
// 2x2矩阵定义
struct Matrix{
ll m[2][2];
Matrix(){
m[0][0] = m[0][1] = m[1][0] = m[1][1] = 0;
}
Matrix operator * (const Matrix& a)const{
Matrix res;
for(int i = 0; i < 2; ++i){
for(int k = 0; k < 2; ++k){
for(int j = 0; j < 2; ++j){
res.m[i][j] += (m[i][k] * a.m[k][j]) % MOD;
}
}
}
return res;
}
};
// 快速幂
Matrix qpow(Matrix base, ll exp){
Matrix res;
res.m[0][0] = res.m[1][1] = 1;
while(exp){
if(exp & 1) res = res * base;
base = base * base;
exp >>= 1;
}
return res;
}
signed main() {
cin >> n;
if(n <= 2){
if(n == 0) cout << "0\n";
else cout << "1\n";
return 0;
}
Matrix base;
base.m[0][0] = base.m[0][1] = base.m[1][0] = 1;
base.m[1][1] = 0;
Matrix res = qpow(base, n - 2);
// f(n) = res[0][0]*f(2) + res[0][1]*f(1)
ll fn = (res.m[0][0] + res.m[0][1]) % MOD;
cout << fn << "\n";
return 0;
}