#include #ifndef LOCAL_ #define fprintf if( false ) fprintf #endif // LOCAL_ #define dump() fprintf(stderr, "#%s.%d\n", __func__, __LINE__); #define dumpl(x1) fprintf(stderr, "#%s.%d (%s) = (%ld)\n", __func__, __LINE__, #x1, x1); #define dumpll(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%ld, %ld)\n", __func__, __LINE__, #x1, #x2, x1, x2); #define dumplll(x1, x2, x3) fprintf(stderr, "#%s.%d (%s, %s, %s) = (%ld, %ld, %ld)\n", __func__, __LINE__, #x1, #x2, #x3, x1, x2, x3); #define dumpd(x1) fprintf(stderr, "#%s.%d (%s) = (%lf)\n", __func__, __LINE__, #x1, x1); #define dumpdd(x1, x2) fprintf(stderr, "#%s.%d (%s, %s) = (%lf, %lf)\n", __func__, __LINE__, #x1, #x2, x1, x2); #define loop for(;;) typedef std::vector LI; typedef std::queue QI; #define rep(i,n) for(long i = 0; i < (long)n; ++i) const double pi = M_PI; const long mod = 1000000007; template void scan1(T& x) { fprintf(stderr, "unknown type\n"); } template<> void scan1(long& x) { if( scanf("%ld", &x) < 0 ) exit(0); } template<> void scan1(std::string& x) { if( not ( std::cin >> x ) ) exit(0); } void scan() {} template void scan(Head& x, Tail&... xs) { scan1(x); scan(xs...); } struct Solver { Solver() { fprintf(stderr, "--------Solver begin--------\n"); } ~Solver() { fprintf(stderr, "--------Solver end--------\n"); } void solve() { long odd = 0, even = 0; LI xs(112345, 0); xs[1] = 1; odd += xs[1]; long n; scan(n); for(long i = 2; i <= n; ++i) { if( i % 2 == 0 ) { xs[i] = i * odd % mod; even = (even + xs[i]) % mod; } else { xs[i] = i * even % mod; odd = (odd + xs[i]) % mod; } } printf("%ld\n", xs[n]); } }; int main() { loop std::unique_ptr(new Solver())->solve(); }