Tarea 5 de Diseño de Algoritmos

Trimestre 2012 Invierno
Entrega: 9 de marzo de 2012 a las 22:00.

Observa que estos dos problemas son casi los mismos que uno de la tarea 1 y uno de la tarea 4, excepto que pueden involucrar valores de N mucho más grandes y cálculos módulo M. Para esto recuerda que las operaciones módulo M se pueden realizar indistintamente antes o después de otras operaciones, en particular (A+B) módulo M es igual a ((A módulo M) + (B módulo M)) módulo M y (A*B) módulo M es igual a ((A módulo M) * (B módulo M)) módulo M.

Problema 1: Sean N, P y Q tres enteros positivos. Diseña un algoritmo de memoización o de programación dinámica que calcule la cantidad S de formas en que se puede obtener el valor N sumando enteros distintos entre P y Q. Dos sumas se consideran idénticas si sólo difieren en el orden de sus sumandos. Por ejemplo, si N = 12, P = 3 y Q = 7 entonces S = 2 porque 12 se puede obtener de las siguientes formas: 3+4+5 y 5+7. Escribe un programa llamado sumameZZ (donde ZZ es una clave de dos dígitos asignada por el profesor) que implemente tu algoritmo. La entrada a tu programa serán los tres enteros N, P y Q (con 1 <= P <= Q <= N <= 1000) y la salida de tu programa será el entero S.

Ejemplo de entrada
Ejemplo de salida
12 3 7 2

Problema 2: Los números de Sylvester se definen de la siguiente manera: S[0] = 2 y S[N] = S[N-1](S[N-1] - 1) + 1. Escribe un programa llamado sylvmeZZ (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 Sylvester módulo M (es decir S[N] mod M). Por ejemplo si N = 3 y M = 5 entonces tu programa debe calcular S[3] mod 5 = 43 mod 5 = 3. Puedes suponer que 0 <= N, M <= 1,000,000.

Ejemplo de entrada
Ejemplo de salida
3 5
3

N
otas: Tus 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.