抽屉原理。
奇数与奇数不能相邻,先将奇数进行排列(设奇数数量为 ),排列后会产生
个空隙,后将偶数进行插入。
显然如果 是奇数,那么排列中的奇数数量比偶数数量多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;
}

京公网安备 11010502036488号