Saltar al contenido

Los barcos de abasto

Enunciado

Obdulia tiene la única tienda de la isla y todo lo que vende llega por mar. Dos barcos la surten: uno pasa cada a días y el otro cada b días. Hoy es el día 0 y los dos acaban de descargar, así que el primero vuelve el día a, el siguiente el día 2 * a, y así; el otro hace lo mismo con b. El día 0 no cuenta, porque ya pasó.

Un día en que llega cualquiera de los dos es un día de abasto, y cuando los dos llegan el mismo día sigue siendo un solo día de abasto: cuenta una vez, no dos.

Escribe una función que reciba a, b y n (los tres de 1 en adelante) y regrese qué día cae el abasto número n.

Con a igual a 2, b igual a 3 y n igual a 5, los días de abasto son 2, 3, 4, 6, 8... El 6 es uno solo aunque lleguen los dos barcos, así que el quinto abasto cae el día 8.

Con 4, 6 y 7 los días son 4, 6, 8, 12, 16, 18 y 20: el séptimo cae el 20. a y b llegan hasta 100 000 y n hasta mil millones, así que la respuesta puede tener catorce cifras y contar día por día no termina nunca. Lo que sí se puede es preguntar, para un día cualquiera, cuántos abastos hubo hasta ahí: los múltiplos de a que caben, más los múltiplos de b que caben, menos los que se contaron dos veces porque son múltiplos de los dos a la vez. Esa cuenta no recorre nada, y con ella puedes partir el rango de días por la mitad.

Los días en que coinciden los dos barcos son los múltiplos del primer día en que llegan juntos, y ese día es el número más chico que es múltiplo de a y de b a la vez: el mínimo común múltiplo. Una forma de sacarlo es a partir del divisor común más grande de los dos, y ese divisor lo escribes tú, porque JavaScript no trae ninguno.

Ejemplos

  • El del ejemplo

    2, 3, 5 → 8

  • Cada cuatro y cada seis

    4, 6, 7 → 20

  • Los dos barcos con el mismo paso

    5, 5, 4 → 20

  • Uno llega a diario

    1, 4, 10 → 10

  • Uno cada dos y otro cada cuatro

    2, 4, 9 → 18

Además de estas, el reto tiene pruebas ocultas que se revelan al enviar tu solución.

Empiezas con esto

Python

def dia_de_abasto(a, b, n):
    pass

JavaScript

function diaDeAbasto(a, b, n) {
}
Resolver este reto

Se abre en el navegador, con el editor y las pruebas. Es gratis y no hace falta cuenta para empezar.

Más retos de O(log n)

Ver todos los retos →