Числа Каталана#9643

Числа Каталана (Розбір)

Рекурентне співвідношення перепишемо у вигляді:

с_0 = 1, \\ с_n = c_0c_{n-1} + c_1c_{n-2} + c_2c_{n-3} + ... + c_{n-1}c_0,~при~n > 0

Наприклад,

Оскільки значення с_n обчислюється на основі всіх попередніх значень c_0, c_1, c_2, ..., c_{n-1}, будемо зберігати числа Каталана в лінійному масиві.

Реалізація алгоритму

Оголосимо масив , в якому будемо зберігати значення чисел Каталана: cat[i] = c_i.

long long cat[10001];

Зчитаємо вхідні дані.

scanf("%lld %lld", &n, &m);

Обчислюємо числа Каталана за рекурентною формулою.

cat[0] = 1;
for (i = 1; i <= n; i++)
{
  for (j = 0; j < i; j++)
    cat[i] = (cat[i] + cat[j] * cat[i - j - 1]) % m;
}

Виводимо -те число Каталана.

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

Python реалізація

Зчитаємо вхідні дані.

n, m = map(int, input().split())

У списку будемо зберігати значення чисел Каталана: cat[i] = c_i.

cat = [0] * (n + 1)

Обчислюємо числа Каталана за рекурентною формулою.

cat[0] = 1
for i in range(1, n + 1):
  for j in range(i):
    cat[i] = (cat[i] + cat[j] * cat[i - j - 1]) % m

Виводимо -те число Каталана.

print(cat[n])