Нехай — кількість різних способів, якими всі чоловік можуть приєднатися до танцю. Наприклад,
f(1) = 1, одна людина танцює сама;
f(2) = 2, тому що для двох людей є два варіанти: або танцювати окремо, або в парі;
Розглянемо -ту людину:
Якщо вона танцює окремо, то інші n - 1 чоловік можуть приєднатися до танцю f(n - 1) способами.
-та людина може взяти собі в пару будь-кого з n - 1 людей. Інші n - 2 чоловік можуть приєднатися до танцю f(n - 2) способами.
Таким чином маємо співвідношення:
Приклад
Нехай є n = 3 людей. Вони можуть приєднатися до танцю способами:
якщо третя людина танцює окремо: \{1, 2, 3\}, \{\{1, 2\}, 3\};
якщо третя людина танцює в парі: \{1, \{2, 3\}\}, \{2, \{1, 3\}\}.
Обчислимо за формулою:
Реалізація алгоритму
Оголосимо модуль і масив для зберігання результатів: dp[n] = f(n).
#define MOD 1000000007
long long dp[100001];Читаємо вхідне значення .
scanf("%d", &n);Послідовно обчислюємо значення f(1), f(2), ..., f(n), запам'ятовуючи результати в масиві .
dp[1] = 1; dp[2] = 2;
for (i = 3; i <= n; i++)
dp[i] = (dp[i - 1] + (i - 1) * dp[i - 2]) % MOD;Виводимо відповідь.
printf("%lld\n", dp[n]);Python реалізація
Оголосимо модуль , за яким будуть проводитися обчислення.
MOD = 1000000007Читаємо вхідне значення .
n = int(input())Оголосимо список для зберігання результатів: dp[n] = f(n).
dp = [0] * (n + 1)Послідовно обчислюємо значення f(1), f(2), ..., f(n), запам'ятовуючи результати в масиві .
dp[1] = 1
if n > 1: dp[2] = 2
for i in range(3, n + 1):
dp[i] = (dp[i - 1] + (i - 1) * dp[i - 2]) % MODВиводимо відповідь.
print(dp[n])