Codeforces Round #677 (Div. 3)EF
E. Two Round Dances
题意:
把n个人分成两个圆排列,问有几种方法。
思路:
看到圆排列想到第一类斯特林数
首先先从n个数中选出n / 2 ------> C(n , n / 2)
然后对两个部分:
第一个 n / 2 排成一个圆排列的个数:S1(n / 2 , 1) = (n / 2 - 1)!
第二个 n / 2 排成一个圆排列的个数:S1(n / 2 , 1) = (n / 2 - 1)!
左右相同的两个部分情况会有重复,所以 / 2
所以 ans = C(n , n / 2) * (n / 2 - 1)! * (n / 2 - 1)! / 2
代码:
const int maxn = 1e3 + 10; int fac[maxn]; void init(int n) { fac[0] = 1 , fac[1] = 1; for(int i = 2 ; i <= n ; i ++) fac[i] = fac[i - 1] * i; } signed main() { int n; cin >> n; init(n); cout << fac[n] / (fac[n / 2] * fac[n / 2]) * fac[n / 2 - 1] * fac[n / 2 - 1] / 2 << '\n'; return 0; }
F.待补