1. 程式人生 > 實用技巧 >「CF1433E」Two Round Dances - 題解

「CF1433E」Two Round Dances - 題解

  • 前言

    手玩那個逆時針順時針半天,以為是圓排列+鏡面,結果突然來訊息改題了(霧)。


  • 分析

    \(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 ((n-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;
}