#include<iostream>
#include<cstring>
long long mode=1e9+7;
using namespace std;
class Matrix{
private:long long M[20][20];
int R;int C;
public:
Matrix(int r=0,int c=0){
memset(M,0,sizeof(M));
R=r,C=c;
}
long long v(int l,int r){
return M[l][r];
}
void ini(){
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
cin>>M[i][j];
}
}
}
friend Matrix operator *(Matrix a,Matrix b){
if(a.C!=b.R){
Matrix ans;
return ans;
}else{
Matrix ans(a.R,b.C);
for(int i=1;i<=a.R;i++){
for(int j=1;j<=b.C;j++){
for(int k=1;k<=a.C;k++){
ans.M[i][j]+=a.v(i,k)*b.v(k,j);
ans.M[i][j]%=mode;
}
}
}
return ans;
}
}
friend ostream& operator <<(ostream &b,Matrix &a){
for(int i=1;i<=a.R;i++){
for(int j=1;j<=a.C;j++){
b<<a.M[i][j]<<" ";
}
b<<endl;
}
return b;
}
friend Matrix operator^ (Matrix ,int );
friend void INI();
friend void A();
friend void B();
};
Matrix BASE(2,2);
Matrix operator^ (Matrix a,int b){
Matrix base=a;
Matrix ans=BASE;
while(b!=1){
bool flag=false;
if(b&1){
flag=true;
b--;
}
base=base*base;
if(flag){
ans=a*ans;
}
b>>=1;
}
return ans*base;
}
void INI(){
memset(BASE.M,0,sizeof(BASE.M));
for(int i=1;i<=2;i++){
BASE.M[i][i]=1;
}
}
Matrix a(1,2);
Matrix b(2,2);
void A(){
for(int i=1;i<=2;i++){
a.M[1][i]=1;
}
return;
}
void B(){
b.M[1][2]=1;
b.M[2][1]=1;
b.M[2][2]=1;
}
int main(){
INI();
A();
B();
Matrix c;
int n;
cin>>n;
if(n==1||n==2){
cout<<1;
return 0;
}
b=b^(n-2);
c=a*b;
cout<<c.v(1,2);
}