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

代码:

Codeforces Round #677 (Div. 3)EF
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;
}   
View Code

F.待补

上一篇:BZOJ2839 集合计数


下一篇:「CF722E Research Rover」