#include #define REP(i,n) for(int i=0;i<(int)(n);i++) #define ALL(x) (x).begin(),(x).end() using namespace std; typedef long long ll; const int mod = 1000000007; struct Mod { int n; Mod () : n(0) {;} Mod (int n) : n(n) { if (n >= mod) n %= mod; else if (n < 0) n = (n % mod + mod) % mod; } operator int() { return n; } }; bool operator==(Mod a, Mod b) { return a.n == b.n; } Mod operator+=(Mod &a, Mod b) { a.n += b.n; if (a.n >= mod) a.n -= mod; return a; } Mod operator-=(Mod &a, Mod b) { a.n -= b.n; if (a.n < 0) a.n += mod; return a; } Mod operator*=(Mod &a, Mod b) { a.n = ((long long)a.n * b.n) % mod; return a; } Mod operator+(Mod a, Mod b) { return a += b; } Mod operator-(Mod a, Mod b) { return a -= b; } Mod operator*(Mod a, Mod b) { return a *= b; } ll inv(ll a, ll p) { return (a == 1 ? 1 : (1 - p * inv(p%a, a)) / a + p); } Mod operator/(Mod a, Mod b) { return a * Mod(inv((int)b, mod)); } #define MAX_N 1024000 Mod fact[MAX_N], factinv[MAX_N]; void init() { fact[0] = Mod(1); factinv[0] = 1; REP(i,MAX_N-1) { fact[i+1] = fact[i] * Mod(i+1); factinv[i+1] = factinv[i] / Mod(i+1); } } Mod comb(int a, int b) { return fact[a] * factinv[b] * factinv[a-b]; } int main() { init(); int N; cin >> N; vector dp(N+1, 1); for (int i = 2; i <= N; ++i) { Mod sum = 0; REP(j,i) sum += dp[j] * dp[i-j-1] * comb(i-1, j); dp[i] = sum / Mod(2); } if (N <= 2) cout << 0 << endl; else cout << dp[N] * Mod(2) << endl; return 0; }