#include <bits/stdc++.h>
#include <bitset>
#include <algorithm>
#define mod (int)1000000007
#define int long long
using namespace std;

#define FAST                          \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);
int vis[15000005], vis1[5000005];
vector<int> vec[3000005];
// map<int, int> v2[5000005];
// v1, vec1[3000005];
//int child[2000005];
//int divi[2000005];
int dp[100001];
// int dis[100005] = {0};
// int h[100005];
// int p[100005];
// int dp[100005][100];
// bool f = 0;
// int bad[100005], good[100005];
// int p5[100005];
// int final_sum[300005], max_sum[10005];
// //int level[200005];
// //int time1 = 0;
int parent1[100001];
void dfs(int node, int parent)
{
    vis[node] = 1;
    parent1[node] = parent;
    //level[node] = time1;
    //  time1++;
    for (int i = 0; i < vec[node].size(); i++)
    {
        if (!vis[vec[node][i]])
        {
            //  if (bit[vec[node][i]]            {

            dfs(vec[node][i], node);
            dp[node] += dp[vec[node][i]];
            //  final_sum[node] += final_sum[vec[node][i]];
        }
    } //  if ()
      //   if (b == 0)
      //  count1[b][node] += count1[b][vec[node][i]];
      //}
      // time1--;
}
// int divi[5000005];
// int dp[5000007];
// int pre_sum[5000005];
// vector<int> prime;
// void run()
// {
//     int j = 1;
//     for (int i = 2; i < 5000001; i++)
//     {
//         if (!vis1[i])
//             while (i * j < 5000001)
//             {
//                 vis1[i * j] = 1;
//                 divi[i * j] = i;
//                 j++;
//             }
//         j = 1;
//     }
//     // cout
//     // cerr
//     //     << "sdksd"
//     //     << "\n";
//     // for (int i = 2; i < 5000001; i++)
//     // {
//     //     // cout << i << " " << divi[i] << "\n";
//     //     if (i == divi[i])
//     //         prime.push_back(i);
//     // }
//     for (int i = 1; i < 5000001; i++)
//     {
//         map<int, int> mp;
//         int p = i;
//         while (p > 1)
//         {
//             dp[i]++;
//             p /= divi[p];
//         }
//         //cout << mp.size() << "\n";
//         //v2[i] = v2[i - 1];
//         // for (auto itr : mp)
//         //  {
//         //    v2[i][itr.first] += itr.second;
//         //   }
//         // cerr << i << "hkcxhx"
//         //    << "\n";
//     }
//     for (int i = 1; i < 5000001; i++)
//     {
//         pre_sum[i] = pre_sum[i - 1] + dp[i];
//         // for( auto itr)
//     }
// }
int fastexpo(int a, int b)
{
    int ans = 1;
    while (b)
    {
        if (b & 1)
            ans = (ans * a) % mod;
        b = b / 2;
        a = (a * a) % mod;
    }
    return ans % mod;
}
// // int lowerIndex(int arr[], int n, int x)
// // {
// //     int l = 0, h = n - 1;
// //     while (l <= h)
// //     {
// //         int mid = (l + h) / 2;
// //         if (arr[mid] >= x)
// //             h = mid - 1;
// //         else
// //             l = mid + 1;
// //     }
// //     return l;
// // }

// // // function to find last index <= y
// // int upperIndex(int arr[], int n, int y)
// // {
// //     int l = 0, h = n - 1;
// //     while (l <= h)
// //     {
// //         int mid = (l + h) / 2;
// //         if (arr[mid] <= y)
// //             l = mid + 1;
// //         else
// //             h = mid - 1;
// //     }
// //     return h;
// // }

// // // function to count elements within given range
// //int countInRange(int arr[], int n, int x, int y)
// // {
// //     // initialize result
// //     int count = 0;
//     count = upperIndex(arr, n, y) - lowerIndex(arr, n, x) + 1;
//     return count;
// }
// int dp[1000001];
// int ans[1000001];
int maxAbsValExpr(vector<int> &x, vector<int> &y)
{
    int res = 0, n = x.size(), smallest, cur;
    for (int p : {1, -1})
    {
        for (int q : {1, -1})
        {
            smallest = p * x[0] + q * y[0] + 0;
            for (int i = 1; i < n; ++i)
            {
                cur = p * x[i] + q * y[i] + i;
                res = max(res, cur - smallest);
                smallest = min(smallest, cur);
            }
        }
    }
    return res;
}
int32_t main()
{

    int s;
    cin >> s;
    int p = s / 3;
    int ans = 0;
    for (int i = 1; i <= p; i++)
    {
        int a1 = s - 2 * i - 1;
        int a2 = i - 1;
        int a3 = s - 3 * i;
        int sum1 = 1, sum2 = 1, sum3 = 1;
        for (int j = 1; j <= s - 2 * i - 1; j++)
        {
            sum1 = (sum1 * j) % mod;
        }
        for (int j = 1; j <= i - 1; j++)
        {
            sum2 = (sum2 * j) % mod;
        }
        for (int j = 1; j <= s - 3 * i; j++)
        {
            sum3 = (sum3 * j) % mod;
        }
        // cout << sum1 << " " << sum2 << " " << sum3 << "\n";
        sum1 = (sum1 * fastexpo(sum2, mod - 2)) % mod;
        sum1 = (sum1 * fastexpo(sum3, mod - 2)) % mod;
        ans = (ans + sum1) % mod;
    }
    cout << ans << "\n";

    return 0;
}

Measured memory_bytes: 73936