```cpp=
const int SZ = 2;
struct Matrix{
int mat[SZ][SZ] = {};
Matrix(){}
void makeUnit(){
memset(mat, false, sizeof(mat));
for (int i = 0; i < SZ; i++)
mat[i][i] = 1;
}
};
Matrix operator * (Matrix a, Matrix b){
Matrix answer;
for (int i = 0; i < SZ; i++) // hang cua a
for (int j = 0; j < SZ; j++) // cot cua b
for (int k = 0; k < SZ; k++) // bien chay 0 -> SZ-1
ans.mat[i][j] += 1ll * a.mat[i][k] * b.mat[k][j],
ans.mat[i][j] %= MOD;
return answer;
}
Matrix power(Matrix a, long long n){
if (n == 1) return a;
Matrix answer = power(a, n / 2);
answer = answer * answer;
if (n % 2 == 1) answer = answer * a;
return answer;
}
// Matrix power(Matrix a, long long n){
// Matrix answer; answer.makeUnit();
// while (n > 0){
// if (n & 1)
// answer = answer * a;
// a = a * a, n >>= 1;
// }
// return answer;
// }
main(){
int n; cin >> n;
Matrix base; base.mat[0][0] = 0, base[0][1] = 1; // [f(0) f(1)]
Matrix mul;
mul.mat[0][0] = 0; mul.mat[0][1] = 1;
mul.mat[1][0] = 1; mul.mat[1][1] = 1;
Matrix answer = base * power(mul, n-1);
cout << answer.mat[0][1];
}
```