Representemos nuestros números como cadenas aquí. Ahora, considere que hay [math] N [/ math] estados, donde [math] i [/ math] th state almacena la cadena más pequeña que cuando toma el módulo con [math] N [/ math] da [math] i [/ mates]. Nuestro objetivo es alcanzar el estado 0. Ahora, comenzamos desde el estado “[matemática] 1 [/ matemática]” y en cada paso tenemos dos opciones, ya sea para agregar “[matemática] 0 [/ matemática]” o “[matemática] ] 1 [/ math] “al estado actual. Intentamos explorar ambas opciones, pero tenga en cuenta que si ya he visitado un estado, ¿por qué lo volvería a visitar? Ya almacena la cadena más pequeña que alcanza ese estado y si la vuelvo a visitar con una nueva cadena seguramente tendrá más caracteres que la cadena ya almacenada.
Motivo por el que no tenemos que volver a visitar el mismo estado: dejemos que xey sean cadenas, que tienen el mismo estado. Deje que [math] x [/ math] sea la más pequeña y [math] z [/ math] sea otra cadena que cuando se agrega a [math] y [/ math] nos da un número divisible por [math] n [/ math ] Si es así, también podemos agregar esta cadena a [math] x [/ math], que es más pequeña que [math] y [/ math], y aún así obtener un número divisible por n. Por lo tanto, podemos ignorar [math] y [/ math] de manera segura, ya que el resultado más pequeño se obtendrá solo a través de [math] x [/ math].
Entonces, esto es básicamente un BFS en los estados. Visitaremos un estado casi una vez, por lo tanto, la complejidad general es [math] \ mathcal {O} (N) [/ math]. Lo interesante es que no necesito almacenar la cadena completa para cada estado, solo puedo almacenar el módulo de valor [math] N [/ math] y puedo ver fácilmente a qué dos estados nuevos voy. Puedo reconstruir la cadena cuando llego a mi estado final si almaceno para cada estado: desde donde llegué a ese estado y a través del cual agrego ([matemáticas] 0 [/ matemáticas] o [matemáticas] 1 [/ matemáticas]).
- ¿Qué libro debo comprar para aprender sobre algoritmos: estructuras de datos y algoritmos simplificados por Narsimha Karumanchi o Introducción a los algoritmos (CLRS)?
- ¿Por qué es difícil realizar una búsqueda binaria en una lista vinculada?
- ¿Cuáles son los algoritmos más rápidos para colorear los bordes en un gráfico con max_degree + 1 colores?
- ¿Qué representan realmente los números de Grundy en un juego?
- ¿Qué algoritmos necesito aprender para resolver al menos 5 problemas en los concursos de CodeChef Long?