「CF1433E」Two Round Dances - 题解
-
前言
upt2020/10/23:修改了一个笔误。感谢 @vectorwyx 。
手玩那个逆时针顺时针半天,以为是圆排列+镜面,结果突然来消息改题了(雾)。
-
分析
\(n\) 个人可以分成 \(2\) 组,且组别没有任何区别。
假设先单看组合,那分成两组的数量就是 \(\dfrac{1}{2} \times C_n^ \frac{n}{2}\) 。
现在看单个组。
一个组可以通过转圈圈来改变不同的阵容,写的很清楚了,就是圆排列。
因为 \(n\) 的圆排列为 \((n-1)!\) 。然后这里又有 \(2\) 组。
所以答案为 \(\dfrac{1}{2} \times C_n^ \frac{n}{2} \times ((\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\n",mul[n]/mul[n/2]/mul[n/2]/2*mul[n/2-1]*mul[n/2-1]);
return 0;
}