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

 

Числа Каталана cn задаются рекуррентным соотношением:

с0 = 1,

сn = , n > 0

Вычислите n-ое число Каталана по модулю m.

 

Вход. Два целых числа n (0 ≤ n ≤ 104) и m (0 < m ≤ 109).

 

Выход. Выведите значение cn mod m.

 

Пример входа

Пример выхода

5 100

42

 

 

РЕШЕНИЕ

числа Каталана

 

Анализ алгоритма

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

с0 = 1,

сn = c0cn-1 + c1cn-2 + c2cn-3 + ... + cn-1c0, при n > 0

Например,

·        с0 = 1

·        с1 = c0c0  = 1,

·        с2 = c0c1 + c1c0 = 1 + 1 = 2,

·        с3 = c0c2 + c1c1 + c2c0 = 2 + 1 + 2 = 5,

·        с4 = c0c3 + c1c2 + c2c1 + c3c0 = 5 + 2 + 2 + 5 = 14,

·        с5 = c0c4 + c1c3 + c2c2 + c3c1 + c4c0 = 14 + 5 + 4 + 5 + 14 = 42

Поскольку значение сn пересчитывается через все предыдущие значения c0, c1, c2, ..., cn-1, то значения чисел Каталана будем запоминать в линейном массиве.

 

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

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

 

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;

}

 

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

 

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

 

Python реализация

Читаем входные данные.

 

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

 

В списке cat будем запоминать числа Каталана: cat[i] = ci.

 

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

 

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

 

print(cat[n])