#include <cstdio>
#include <map>
#define MOD 100000007

std::map<int, int> D;

long long int f2(int n)
{
    if( n < 0 ) return 0;
    if( n <= 1 ) return 1;
    if( n == 2 ) return 2;
    if( D[n] == 0 )
    {
        if( n % 2 == 0 ) D[n] = (int)((f2(n/2)*f2(n/2))%MOD+(f2(n/2-1)*f2(n/2-1))%MOD + (2*f2(n/2-1)*f2(n/2-2))%MOD)%MOD;
        else D[n] = (int)((f2(n/2)*f2(n/2+1))%MOD+(f2(n/2-1)*f2(n/2))%MOD + (f2(n/2-1)*f2(n/2-1))%MOD + (f2(n/2-2)*f2(n/2))%MOD)%MOD;
    }
    return (long long int)D[n];
}

int main()
{
    freopen(".10.in","r",stdin);
    freopen(".10.out","w",stdout);
    int n;
    scanf("%d", &n);
    printf("%d\n", f2(n));
}

/*
#include <cstdio>
#include <algorithm>
int S[100001], n, l, c;
long long ans, DT[100001];

int main()
{
    freopen(".2.in","r",stdin);
    scanf("%d%d%d",&n,&l,&c);
    for(int i = 0 ; i < n ; i++ )
        scanf("%d", S+i), S[i]*=l;
    std::sort(S,S+n);
    for(int i = 1 ; i < n ; i++ )
        DT[i] = DT[i-1] + ((S[i]-S[i-1])/c)*i;
    for(int i = 0 ; i < n ; i++ )
        ans += DT[i];
    printf("%d", ans);
}
*/
/*
#include <cstdio>
#define UNDEF 0x7fffffff
struct POINT{ int x, y; } S[50001];
int n;
bool ans;

void solve(int a, int b, int c, int k)
{
    if( ans ) return;
    if( k == n ){
        ans = true;
        return;
    }
    if( a == UNDEF )
        solve(S[k].x, b, c, k+1), solve(-S[k].y, b, c, k+1);
    if( b == UNDEF )
        solve(a, S[k].x, c, k+1), solve(a, -S[k].y, c, k+1);
    if( c == UNDEF )
        solve(a, b, S[k].x, k+1), solve(a, b, -S[k].y, k+1);
    if( a == S[k].x || a == -S[k].y || b == S[k].x || b == -S[k].y || c == S[k].x || c == -S[k].y )
        solve(a, b, c, k+1);
}

int main()
{
    scanf("%d", &n);
    for(int i = 0 ; i < n ; i++ )
        scanf("%d%d",&S[i].x, &S[i].y);
    solve(UNDEF,UNDEF,UNDEF,0);
    puts(ans?"1":"0");
}
*/

