-
前言
upt2020/10/23:修改了一个笔误。感谢 @vectorwyx 。
手玩那个逆时针顺时针半天,以为是圆排列+镜面,结果突然来消息改题了(雾)。
-
分析
(n) 个人可以分成 (2) 组,且组别没有任何区别。
假设先单看组合,那分成两组的数量就是 (dfrac{1}{2} imes C_n^ frac{n}{2}) 。
现在看单个组。
一个组可以通过转圈圈来改变不同的阵容,写的很清楚了,就是圆排列。
因为 (n) 的圆排列为 ((n-1)!) 。然后这里又有 (2) 组。
所以答案为 (dfrac{1}{2} imes C_n^ frac{n}{2} imes ((dfrac{n}{2}-1)!)^2) 。
因为数据较小 (n le 20) ,所以开头阶乘直接预处理即可。
复杂度 (O(n)) 。
- 代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const ll Maxn=20+5;
ll n,mul[Maxn];
int main()
{ scanf("%lld",&n);
mul[0]=1;
for(ll i=1;i<=n;i++)mul[i]=1ll*mul[i-1]*i;
printf("%lld
",mul[n]/mul[n/2]/mul[n/2]/2*mul[n/2-1]*mul[n/2-1]);
return 0;
}