Спочатку слід вибрати людей для першого кола. Це можна зробити C^{n/2}_n способами. Порахуємо кількість способів розташування людей у одному колі. Закріпимо людину, яка буде першою, після чого n / 2 - 1 людей можна розставити будь-яким чином, а саме (n / 2 - 1)! способами. Кількість способів утворити два кола дорівнює:
Ділення на необхідне, щоб не розрізняти пари кіл та . Наприклад, для n = 4, розбиття на кола ([1, 2], [3, 4]) та ([3, 4], [1, 2]) вважаються однаковими.
Спрощуючи дану формулу, ми отримаємо відповідь:
Приклад
Наприклад, для n = 4 кількість способів дорівнює :
Одне коло — , інше — ;
Одне коло — , інше — ;
Одне коло — , інше — .
Згідно з формулою для n = 4, відповідь
Давайте складемо всі розрізняльні кола для n = 4. Розмістимо учасника на першу позицію. На трьох решту позицій можна розмістити будь-яку перестановку трьох інших учасників.
Обертаючи будь-яке з цих розташувань у колі, ми можемо отримати нерозрізняльні кола. Наприклад, такі розташування є нерозрізняльними (розгляньте циклічні зсуви останньої перестановки):
Є 4! = 24 кола з учасниками. Однак кількість розрізняльних кіл для n = 4 є 3! = 6.
Реалізація алгоритму
Функція fact обчислює факторіал числа .
long long fact(int n)
{
long long res = 1;
for (int i = 2; i <= n; i++)
res *= i;
return res;
}Основна частина програми. Зчитайте вхідне значення .
scanf("%d", &n);Обчисліть та виведіть результат.
res = 2 * fact(n - 1) / n;
printf("%lld\n", res);Реалізація на Python
Функція fact обчислює факторіал числа .
def fact(n):
res = 1
for i in range(2, n + 1):
res *= i
return resОсновна частина програми. Зчитайте вхідне значення .
n = int(input())Обчисліть та виведіть результат.
res = 2 * fact(n - 1) // n
print(res)