Tarea 5 de Diseño de Algoritmos

Trimestre 2010 Otoño
Entrega: 8 de noviembre de 2010 a las 22:00.

Observa que estos dos problemas son casi los mismos de la Tarea 1, excepto que involucran 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: Los números de Padovan se definen de la siguiente manera: P(0) = 1, P(1) = 1, P(2) = 1 y P(N) = P(N-2) + P(N-3) para N >= 3. Escribe un programa usando memorización o programación dinámica llamado padopdZZ (donde ZZ es la clave de dos dígitos asignada por el profesor) que lea dos enteros N y M y que calcule el N-ésimo número de Padovan P(N). Como este número puede ser muy grande, el resultado lo deberás expresar módulo M. Por ejemplo si N = 10 y M = 5 entonces P(10) = 12 y esto módulo 5 es igual a 2. Puedes suponer que 0 <= N <= 1,000,000 y que 2 <= M <= 1000.

Ejemplo de entrada
Ejemplo de salida
10 5
2

Problema 2: Considere la definición recursiva de la función Z(n) dada por Z(1) = 1, Z(2) = 1 y para n >= 1 se tiene que Z(2n) = Z(n) * (Z(n+1) + Z(n)) y Z(2n+1) = Z(n)^2 + Z(n+1)^2. Escribe un programa usando memorización o programación dinámica llamado zetapdZZ (donde ZZ es la clave de dos dígitos asignada por el profesor) que lea dos enteros N y M y que calcule el valor de Z(N).  Como este número puede ser muy grande, el resultado lo deberás expresar módulo M. Por ejemplo si N = 10 y M = 7 entonces Z(10) = 75 y esto módulo 7 es igual a 5. Puedes suponer que 0 <= N <= 1,000,000 y que 2 <= M <= 1000.

Ejemplo de entrada
Ejemplo de salida
10 7
5

Notas: 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.