「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;
}
posted @ 2020-10-21 19:49  Rainy7  阅读(269)  评论(0编辑  收藏  举报