#include using namespace std; #define rep(i, a, b) for(int i=a;i<(b);++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef vector vi; using un = long long; using vuc = vector; #define vec vector #define REP(i, a, b) for (un i = (un)a; i < (un)b; i++) ll euclid(ll a, ll b, ll& x, ll& y) { if (!b) return x=1, y=0, a; ll d = euclid(b, a%b, y, x); return y -= a/b * x, d; } const ll mod = 1000000000 + 7; struct Mod { ll x; Mod(ll xx) : x(xx) {} Mod operator+(Mod b) { return Mod((x + b.x) % mod); } Mod operator-(Mod b) { return Mod((x - b.x + mod) % mod); } Mod operator*(Mod b) { return Mod((x * b.x) % mod); } Mod operator/(Mod b) { return *this * invert(b); } Mod invert(Mod a) { ll x, y, g = euclid(a.x, mod, x, y); assert(g == 1); return Mod((x+mod)%mod); } }; un N; vec fact; vec invFact; int main(){ cin.tie(0)->sync_with_stdio(0); cout.tie(0); cin >> N; fact = vec(4*N + 1, Mod(0)); invFact = vec(4*N + 1, Mod(0)); fact[0] = 1; REP(i, 1, 4*N+1) { fact[i] = Mod(i) * fact[i-1]; } REP(i, 0, 4*N + 1) { invFact[i] = Mod(1) / fact[i]; } Mod ret = 0; REP(k, 1, (N/2) + 1) { Mod now = fact[N] * invFact[k] * invFact[N-k] * fact[4*(N-k)] * invFact[2*N] * invFact[2*N - 4*k]; if (k % 2 == 1) ret = ret + now; else ret = ret - now; } cout << ret.x << endl; }