#define _CRT_SECURE_NO_WARNINGS   #include <vector>   #include <string>   #include <map>   #include <queue>   #include <unordered_map>   #include <unordered_set>   #include <cassert>   #include <complex>   #include <cstdio>   #include <iostream>   #include <iomanip>   #include <cmath>   #include <functional>   #include <algorithm>   #include <stack>   #include <numeric>   #include <set>   #include <chrono>   #include <random>      #define all(X) (X).begin(), (X).end()   #define int long long   #define m_p make_pair   #define endl   n    using namespace std;   mt19937_64 rnd(std::chrono::system_clock::now().time_since_epoch().count());      const int MAXN = 1e6 + 100, mod = 1e9 + 7;      int gcd(int a, int b) {    if (b == 0)     return a;    else     return gcd(b, a % b);   }      void extgcd(int a, int b, int &x, int &y) {    if (b == 0) {     x = 1; y = 0;     return;    }    else {     extgcd(b, a % b, x, y);     int temp = y;     y = x - (a / b) * y;     x = temp;    }   }      int inv(int a, int mod) {    int x, y;    extgcd(a, mod, x, y);    x = (x % mod + mod) % mod;    return x;   }      int f[MAXN];      int c(int n, int k) {    if (n < 0 || n < 0 || n - k < 0)     return 0;    return (f[n] * inv(f[n - k] * f[k], mod)) % mod;   }      signed main() {    ios::sync_with_stdio(0);    cin.tie(0);   #ifndef ONLINE_JUDGE    freopen( input.txt ,  r , stdin);   #endif       int n; cin >> n;    f[0] = 1;    for (int i = 1; i <= n; i++)     f[i] = (f[i - 1] * i) % mod;       int ans = 0;    for (int k = 0; k <= n; k++) {     if ((n - k) % 2)      continue;     ans += (f[n - k] * ((2 * c(n - k - 1, k) + 4 * c(n - k - 1, k - 1)) % mod)) % mod;     ans %= mod;    }    cout << ans;    return 0;   }