Tarea 1 de Diseño de Algoritmos

Trimestre 2012 Otoño
Entrega: 24 de septiembre de 2012 a las 22:00.

Problema 1 [5 puntos]: Los números de Catalán se definen de la siguiente manera: C[0] = 1 y C[N] = (4N-2) C[N-1] / (N+1). Escriba un programa llamado catalanZZ (donde ZZ es la clave de dos dígitos asignada por el profesor) que lea dos enteros N, M y que calcule el N-ésimo número de Catalán módulo M (es decir C[N] mod M). Por ejemplo si N = 5 y M = 4 entonces su programa debe calcular C[5] mod 4 = 42 mod 4 = 2. Puede suponer que 0 <= N <= 100 y que 2 <= M <= 100.

Ejemplo de entrada
Ejemplo de salida
5 4
2

Problema 2 [5 puntos]: Los números de Stirling se definen de la siguiente manera: S[0,0] = 1, S[N,0] = 0 y S[0,N] = 0 para toda N > 0 y S[N,K] = (N-1) S[N-1,K] + S[N-1,K-1] para toda N > 0 y K > 0. Escriba un programa llamado stirlingZZ (donde ZZ es la clave de dos dígitos asignada por el profesor) que lea tres enteros N, K, M y que calcule el número de Stirling S[N,K] módulo M. Por ejemplo si N = 5, K = 3 y M = 6 entonces su programa debe calcular S[N,K] mod 6 = 35 mod 6 = 5. Puede suponer que 0 <= K <= N <= 100 y que 2 <= M <= 100.

Ejemplo de entrada
Ejemplo de salida
5 3 6
5

Notas: Sus programas no deben leer ni escribir nada adicional a lo que se indica en el enunciado. El tiempo de ejecución de sus algoritmos será considerado como parte de la evaluación.

Ejemplo: Si hubiera pedido la tarea con los números de Fibonacci, el siguiente sería un código que hubiera llevado a cabo la tarea tal como está descrita.

#include <stdio.h>

int f(int n, int m)
{
if (n <= 1) return n;
return (f(n-1)+f(n-2))%m;
}

int main(void)
{
int n, m;
scanf("%d%d",&n,&m);
printf("%d",f(n,m));
return 0;
}