抽屉原理。

奇数与奇数不能相邻,先将奇数进行排列(设奇数数量为 ),排列后会产生 个空隙,后将偶数进行插入。

显然如果 是奇数,那么排列中的奇数数量比偶数数量多1,我们只能让偶数以“奇-偶-奇-偶...奇-偶-奇”的形式插入。

如果 是偶数,排列中的奇偶数数量相等,以“奇-偶-奇-偶...奇-偶-奇”的形式插入后还剩下一个偶数,那么剩下的这个偶数有 种插入方式。

#include<bits/stdc++.h>

using namespace std;

#define pb push_back
#define fi first
#define se second
#define endl '\n'
// ---
using ll=long long;
using ull=unsigned long long;
// ---
template<class K,class V>
using umap=unordered_map<K,V>;
template<class T>
using max_heap=priority_queue<T>;
template<class T>
using min_heap=priority_queue<T,vector<T>,greater<T>>;
// ---
// 创建随机引擎
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

// 生成一个在 [l, r] 间的随机整数
int randint(int l, int r) {
    uniform_int_distribution<int> dist(l, r);
    return dist(rng);
}

// 生成一个 [0,1) 的随机实数
double randdbl() {
    uniform_real_distribution<double> dist(0.0, 1.0);
    return dist(rng);
}
// ---
const int INF=1e9;
const ll  LINF=4e18; 
const int mod=1e9+7;
const double eps=1e-9; 
// ---

ll fac(ll num)
{
	ll res=1;
	while(num>=2)
	{
		res=res*num%mod;
		num--;
	}
	return res%mod;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int n; cin>>n;
	ll odd=((n+1)>>1),even=(n>>1);
	ll val1=fac(odd),val2=fac(even);
	ll ans=val1*val2%mod;
	if((n&1)==0)	
	{
		ans=ans*(odd+1)%mod;
	}
	cout<<ans;
	return 0;
}