rt 80pts
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int mod=1e9+7;
int Add(int x,int y) {return x+y>=mod?x+y-mod:x+y;}
int Mul(int x,int y) {return 1ll*x*y%mod;}
char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
//#define getchar gc
int read(){
int x=0,f=0;char c=getchar();
while(!isdigit(c)) f|=(c=='-'),c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
void write(int x){
if(x/10) write(x/10);
putchar(x%10^48);
}
void print(int x){
if(x<0) putchar('-'),x=-x;
write(x);putchar('\n');
}
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
#define debug cout<<"fuck"
struct Matrix{
int v[3][3];
Matrix(){
memset(v,0,sizeof v);
}
Matrix operator *(const Matrix &b)const{
Matrix sum;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
sum.v[i][j]=Add(sum.v[i][j],Mul(v[i][k],b.v[k][j]));
return sum;
}
};
Matrix qpow(int y){
Matrix ans,base;
ans.v[1][1]=ans.v[1][2]=1;
base.v[1][1]=base.v[1][2]=base.v[2][1]=1;
for(;y;y>>=1,base=base*base) if(y&1) ans=ans*base;
return ans;
}
signed main(){
int n=read();
if(n<=2) return puts("1")&&0;
Matrix ans=qpow(n-2);
print(ans.v[1][1]);
return 0;
}