İnsanlardan cütlər#11288

İnsanlardan cütlər (Həll təhlili)

Tutaq ki, — bütün nəfərin rəqsə qoşulmasının müxtəlif yollarının sayıdır. Məsələn,

-ci şəxsi nəzərdən keçirək:

Beləliklə, belə bir əlaqə əldə edirik:

f(n) = f(n - 1) + (n - 1) \cdot f(n - 2)

Misal

Tutaq ki, n = 3 nəfər var. Onlar rəqsə yollarla qoşula bilərlər:

Formulaya əsasən hesablayaq:

f(3) = f(2) + 2 \cdot f(1) = 2 + 2 \cdot 1 = 4

Alqoritmin reallaşdırılması

Modul və nəticələri saxlamaq üçün massiv elan edək: dp[n] = f(n).

#define MOD 1000000007
long long dp[100001];

Giriş olaraq oxuyuruq.

scanf("%d", &n);

massivində ardıcıl olaraq f(1), f(2), ..., f(n) dəyərlərini hesablayırıq.

dp[1] = 1; dp[2] = 2;
for (i = 3; i <= n; i++)
  dp[i] = (dp[i - 1] + (i - 1) * dp[i - 2]) % MOD;

Cavabı çap edirik.

printf("%lld\n", dp[n]);

Python reallaşdırılması

Hesablama aparılacaq modul elan edək.

MOD = 1000000007

Giriş olaraq oxuyuruq.

n = int(input())

Nəticələri saxlamaq üçün siyahı elan edək: dp[n] = f(n).

dp = [0] * (n + 1)

massivində ardıcıl olaraq f(1), f(2), ..., f(n) dəyərlərini hesablayırıq.

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

Cavabı çap edirik.

print(dp[n])