Chúng ta có thể sử dụng khử nhân ma trận
(Tham khảo thêm ở blog này: https://codeforces.com/blog/entry/14516)
Code mẫu:
`cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9 + 7;
map<int, int> fibo;
int recur(int n) {
if (fibo.count(n)) return fibo[n];
int k = n / 2;
if (n & 1) return fibo[n] = (recur(k) * recur(k + 1) + recur(k - 1) * recur(k)) % mod;
else return fibo[n] = (recur(k) * recur(k) + recur(k - 1) * recur(k - 1)) % mod;
}
signed main(){
int n; cin >> n;
fibo[0] = fibo[1] = 1;
cout << (n == 0 ? 0 : recur(n-1));
}
Code mẫu (Hãy code thử trước khi xem):
#∈clude<bitsstdc++.h>usingnamespacestd;#def∈e∫longlong#def∈e∨i→→r<→→r<∫〉#def∈eFOR(i,a,b)for(∫i=a;i<(∫)b;i++)const∫MOD=1e9+7;voput(){#def∈etasknamemainif