#include <iostream> using namespace std; const int MOD = 1e9 + 7; const int MAX = 1e6 + 5; long long fact[MAX], inv_fact[MAX]; // 快速幂取模 long long pow_mod(long long x, int n) { long long res = 1; while (n) { if (n & 1) res = res * x % MOD; x = x * x % MOD; n >>= 1; } return res; } // 预处理阶乘和逆元 void precompute() { fact[0] = 1; for (int i = 1; i < MAX; i++) { fact[i] = fact[i-1] * i % MOD; } inv_fact[MAX-1] = pow_mod(fact[MAX-1], MOD-2); for (int i = MAX-2; i >= 0; i--) { inv_fact[i] = inv_fact[i+1] * (i+1) % MOD; } } // 组合数计算 long long comb(int n, int k) { if (k < 0 || k > n) return 0; return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD; } int main() { precompute(); int n; cin >> n; int k = n / 3; int s = n / 2 - k; int m = n - k; if (s < 0 || s > k || s > m) { cout << 0 << endl; return 0; } //从 m 个位置中选择 s 个位置,再从K个3的公倍数中选出S个,对K个数和n-k个数全排列 long long c = comb(m, s); long long perm1 = fact[k] * inv_fact[k - s] % MOD; long long perm2 = fact[k] * inv_fact[s] % MOD; long long ans = c * perm1 % MOD; ans = ans * perm2 % MOD; ans = ans * fact[n - k] % MOD; cout << ans << endl; return 0; }