#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 toUnit(){
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 % MOD + (f[i][k] % MOD * other.f[k][j] % MOD) % MOD) % MOD;
}
res.f[i][j] = total % MOD;
}
}
return res;
};
};
Matrix UnitMatrix(3, 3);
Matrix Pow(Matrix t, long long exp){
if(!exp){
return UnitMatrix;
}
Matrix tmp = Pow(t, exp / 2);
if(exp % 2 == 0) return tmp * tmp;
return tmp * tmp * t;
}
int main(){
fastip();
UnitMatrix.toUnit();
cin >> n;
Matrix T(3, 3);
T.f = {
{1, 1, 0},
{1, 0, 0},
{0, 1, 0}
};
Matrix dp(3, 1);
dp.f = {
{2},
{1},
{1}
};
Matrix res = Pow(T, n - 2) * dp;
cout << res.f[0][0];
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk5BTUUgIkNBTkRZIgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgTUFYTiA9IDUwMTsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OwoKdm9pZCBmYXN0aXAoKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4oRk5BTUUiLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9Cn0KCmxvbmcgbG9uZyBuOwoKc3RydWN0IE1hdHJpeHsKICAgIGludCBuLCBtOwogICAgdmVjdG9yPHZlY3Rvcjxsb25nIGxvbmc+PiBmOwoKICAgIE1hdHJpeChpbnQgTiwgaW50IE0pewogICAgICAgIG4gPSBOLCBtID0gTTsKICAgICAgICBpZihuID4gMCAmJiBtID4gMCl7CiAgICAgICAgICAgIGYucmVzaXplKG4sIHZlY3Rvcjxsb25nIGxvbmc+KG0gLCAwKSk7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgdG9Vbml0KCl7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG4gOyBpKyspewogICAgICAgICAgICBmW2ldW2ldID0gMTsKICAgICAgICB9CiAgICB9CgogICAgTWF0cml4IG9wZXJhdG9yICogKGNvbnN0IE1hdHJpeCAmb3RoZXIpIGNvbnN0IHsKICAgICAgICBNYXRyaXggcmVzKG4gLCBvdGhlci5tKTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbiA7IGkrKyl7CiAgICAgICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBvdGhlci5tIDsgaisrKXsKICAgICAgICAgICAgICAgIGxvbmcgbG9uZyB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbSA7IGsrKyl7CiAgICAgICAgICAgICAgICAgICAgdG90YWwgPSAodG90YWwgJSBNT0QgKyAoZltpXVtrXSAlIE1PRCAqIG90aGVyLmZba11bal0gJSBNT0QpICUgTU9EKSAlIE1PRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcy5mW2ldW2pdID0gdG90YWwgJSBNT0Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH07Cn07CgpNYXRyaXggVW5pdE1hdHJpeCgzLCAzKTsKCk1hdHJpeCBQb3coTWF0cml4IHQsIGxvbmcgbG9uZyBleHApewogICAgaWYoIWV4cCl7CiAgICAgICAgcmV0dXJuIFVuaXRNYXRyaXg7CiAgICB9CiAgICBNYXRyaXggdG1wID0gUG93KHQsIGV4cCAvIDIpOwogICAgaWYoZXhwICUgMiA9PSAwKSByZXR1cm4gdG1wICogdG1wOwogICAgcmV0dXJuIHRtcCAqIHRtcCAqIHQ7Cn0KCmludCBtYWluKCl7CiAgICBmYXN0aXAoKTsKICAgIFVuaXRNYXRyaXgudG9Vbml0KCk7CgogICAgY2luID4+IG47CgogICAgTWF0cml4IFQoMywgMyk7CiAgICBULmYgPSB7CiAgICAgICAgezEsIDEsIDB9LAogICAgICAgIHsxLCAwLCAwfSwKICAgICAgICB7MCwgMSwgMH0KICAgIH07CgogICAgTWF0cml4IGRwKDMsIDEpOwogICAgZHAuZiA9IHsKICAgICAgICB7Mn0sCiAgICAgICAgezF9LAogICAgICAgIHsxfQogICAgfTsKCiAgICBNYXRyaXggcmVzID0gUG93KFQsIG4gLSAyKSAqIGRwOwoKICAgIGNvdXQgPDwgcmVzLmZbMF1bMF07CgogICAgcmV0dXJuIDA7Cn0=