¿Qué es un algoritmo que calculará si se puede pagar la cantidad [math] n [/ math] si tenemos un suministro ilimitado de monedas para cada valor entre [math] a [/ math] y [math] b [/ math] ?

Suponga que usará exactamente monedas [matemáticas] k [/ matemáticas]. ¿Qué cantidades puedes pagar?

Claramente, la cantidad más pequeña que puede pagar es [math] ka [/ math] y la cantidad más grande es [math] kb [/ math]. ¿Qué pasa con las cantidades entre estos dos valores? Resulta que también puedes pagar a cada uno de ellos. (La prueba está abajo).

Por lo tanto, debemos verificar si una cantidad dada [matemática] n [/ matemática] se encuentra en el intervalo [matemática] [ka, kb] [/ matemática] para alguna [matemática] k [/ matemática]. En otras palabras, debemos tener [math] ka \ leq n [/ math] y también [math] n \ leq kb [/ math].

Dado que [math] k [/ math] es un número entero, debemos tener [math] k \ leq \ lfloor n / a \ rfloor [/ math] y [math] k \ geq \ lceil n / b \ rceil [ /mates]. (Los paréntesis extraños representan la función de piso y techo, respectivamente).

Cualquiera de esas [matemáticas] k [/ matemáticas] nos da una solución válida. Por lo tanto, la solución completa es verificar si [math] \ lceil n / b \ rceil \ leq \ lfloor n / a \ rfloor [/ math].

(El tutorial de Codeforces utiliza un paso intermedio: primero calcula la mayor [matemática] k [/ matemática] como [matemática] \ lfloor n / a \ rfloor [/ matemática], y luego verifica si esto [matemática] k [/ matemáticas] también satisface la otra desigualdad.)


Prueba de que podemos pagar todos los valores en [math] [ka, kb] [/ math]:

Una forma de pagar exactamente [matemáticas] p [/ matemáticas], donde [matemáticas] ka \ leq p \ leq kb [/ matemáticas], es usar exactamente [matemáticas] p \ bmod k [/ matemáticas] monedas por valor de [matemáticas] (p \ mathop {\ rm div} k) +1 [/ math] each, y [math] k- (p \ bmod k) [/ math] monedas por valor de [math] (p \ mathop {\ rm div} k ) [/ math] cada uno.

En otras palabras, escribamos [matemáticas] p = kq + r [/ matemáticas]. Si tuviéramos que usar [math] k [/ math] monedas por valor de [math] q [/ math] cada una, pagaríamos [math] kq [/ math]. Para pagar [matemática] r [/ matemática] más, aumentaremos el valor de [matemática] r [/ matemática] de nuestras monedas en 1.

El argumento anterior también se puede visualizar muy bien. Imagina hacer agujeros [matemáticos] k [/ matemáticos] en el suelo, dispuestos en un círculo. Ahora toma las canicas [math] p [/ math] y comienza a caminar alrededor del círculo. Cada vez que encuentre un agujero, coloque una canica adentro. Cuando te quedas sin canicas, los conteos de canicas en los agujeros son los valores de las monedas que debes usar. Tenga en cuenta que generalmente también hay muchas otras soluciones: simplemente reorganice las canicas de cualquier manera, de modo que ningún hoyo tenga menos de [math] a [/ math] o más de [math] b [/ math] de ellas.