#include <bits/stdc++.h>
#define FNAME "CANDY"
using namespace std;
const int MAXN = 501;
typedef long long ll;
const int MOD = 1e9 + 7;
void fastip() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(FNAME".inp", "r")) {
freopen(FNAME".inp", "r", stdin);
freopen(FNAME".out", "w", stdout);
}
}
long long n;
struct Matrix{
int n , m;
vector<vector<long long>> f;
Matrix(int N, int M){
n = N;
m = M;
if(N > 0 && M > 0){
f.resize(n, vector<long long>(m , 0));
}
}
void Unit(){
for(int i = 0; i < n ; i++){
f[i][i] = 1;
}
}
Matrix operator * (const Matrix &other) const {
Matrix res(n , other.m);
for(int i = 0; i < n ; i++){
for(int j = 0; j < other.m ; j++){
long long total = 0;
for(int k = 0; k < m ; k++){
total = (total + f[i][k] * other.f[k][j]) % MOD;
}
res.f[i][j] = total % MOD;
}
}
return res;
}
};
Matrix to_Unit(2, 2);
Matrix Pow(Matrix t, long long index){
if(!index) return to_Unit;
Matrix tmp = Pow(t, index / 2);
if(index % 2 == 0){
return tmp * tmp;
}
return tmp * tmp * t;
}
int main(){
fastip();
to_Unit.Unit();
cin >> n;
Matrix T(2 , 2);
T.f = {
{1 , 1},
{1 , 0}
};
Matrix dp(2, 1);
dp.f = {
{1},
{0}
};
Matrix res = Pow(T, n - 1);
res = res * dp;
if(n == 0) cout << 0;
else cout << res.f[0][0];
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk5BTUUgIkNBTkRZIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgTUFYTiA9IDUwMTsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwoKdm9pZCBmYXN0aXAoKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4oRk5BTUUiLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9Cn0KCmxvbmcgbG9uZyBuOwoKc3RydWN0IE1hdHJpeHsKICAgIGludCBuICwgbTsKICAgIHZlY3Rvcjx2ZWN0b3I8bG9uZyBsb25nPj4gZjsKCiAgICBNYXRyaXgoaW50IE4sIGludCBNKXsKICAgICAgICBuID0gTjsKICAgICAgICBtID0gTTsKICAgICAgICBpZihOID4gMCAmJiBNID4gMCl7CiAgICAgICAgICAgIGYucmVzaXplKG4sIHZlY3Rvcjxsb25nIGxvbmc+KG0gLCAwKSk7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgVW5pdCgpewogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuIDsgaSsrKXsKICAgICAgICAgICAgZltpXVtpXSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIE1hdHJpeCBvcGVyYXRvciAqIChjb25zdCBNYXRyaXggJm90aGVyKSBjb25zdCB7CiAgICAgICAgTWF0cml4IHJlcyhuICwgb3RoZXIubSk7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG4gOyBpKyspewogICAgICAgICAgICBmb3IoaW50IGogPSAwOyBqIDwgb3RoZXIubSA7IGorKyl7CiAgICAgICAgICAgICAgICBsb25nIGxvbmcgdG90YWwgPSAwOwogICAgICAgICAgICAgICAgZm9yKGludCBrID0gMDsgayA8IG0gOyBrKyspewogICAgICAgICAgICAgICAgICAgIHRvdGFsID0gKHRvdGFsICsgZltpXVtrXSAqIG90aGVyLmZba11bal0pICUgTU9EOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzLmZbaV1bal0gPSB0b3RhbCAlIE1PRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQp9OwoKTWF0cml4IHRvX1VuaXQoMiwgMik7CgpNYXRyaXggUG93KE1hdHJpeCB0LCBsb25nIGxvbmcgaW5kZXgpewogICAgaWYoIWluZGV4KSByZXR1cm4gdG9fVW5pdDsKICAgIE1hdHJpeCB0bXAgPSBQb3codCwgaW5kZXggLyAyKTsKICAgIGlmKGluZGV4ICUgMiA9PSAwKXsKICAgICAgICByZXR1cm4gdG1wICogdG1wOwogICAgfQogICAgcmV0dXJuIHRtcCAqIHRtcCAqIHQ7Cn0KCmludCBtYWluKCl7CiAgICBmYXN0aXAoKTsKICAgIHRvX1VuaXQuVW5pdCgpOwoKICAgIGNpbiA+PiBuOwoKICAgIE1hdHJpeCBUKDIgLCAyKTsKCiAgICBULmYgPSB7CiAgICAgICAgezEgLCAxfSwKICAgICAgICB7MSAsIDB9CiAgICB9OwoKICAgIE1hdHJpeCBkcCgyLCAxKTsKCiAgICBkcC5mID0gewogICAgICAgIHsxfSwKICAgICAgICB7MH0KICAgIH07CgogICAgTWF0cml4IHJlcyA9IFBvdyhULCBuIC0gMSk7CiAgICByZXMgPSByZXMgKiBkcDsKCiAgICBpZihuID09IDApIGNvdXQgPDwgMDsKICAgIGVsc2UgY291dCA8PCByZXMuZlswXVswXTsKCiAgICByZXR1cm4gMDsKfQ==