¿Cuál es el mejor enfoque para resolver el problema que CRYPTO preguntó en el concurso de codificación PRAVEGA 2014 celebrado en Codechef el 9 de noviembre?

La idea es resolver este problema utilizando el cálculo previo.

A partir de la declaración, podemos inferir que todos los dígitos deben ser pares (incluido 0 ya que han pedido que no se considere 0 divisible por 11)

Ahora, simplemente intentaremos hacer que cada nuevo número de la lista de números usados ​​agregue uno de los dígitos pares en la parte posterior.

Cada vez que lo hacemos, obtenemos un nuevo número y necesitamos probar este número si alguna de sus subcadenas es divisible por 11.

Si es divisible, omitiremos este número; de lo contrario, lo agregaremos a la matriz precalculada.

Por ej. [matemáticas] 2 [/ matemáticas] es un cifrado válido.

Podemos obtener [matemáticas] 20 [/ matemáticas], [matemáticas] 22 [/ matemáticas], [matemáticas] 24 [/ matemáticas], [matemáticas] 26 [/ matemáticas] o [matemáticas] 28 [/ matemáticas] de ella.

Claramente, [math] 22 [/ math] es divisible por [math] 11 [/ math] así que lo descartaremos.

Además, las subcadenas se deben verificar y no solo el nuevo número, es decir

[math] 32 [/ math] es aceptable y podemos obtener [math] 322 [/ math] de él.

Pero, [matemática] 322 [/ matemática] no se toma ya que [matemática] 22 [/ matemática] es una subcadena de la misma, y ​​es divisible por [matemática] 11 [/ matemática].

Ahora, si el número de elementos precalculados excede 1500000, nos separamos.

Nota sobre la implementación:

Al principio puede parecer que podemos iterar sobre todos los números de dígitos pares y solo verificar si ninguna de las subcadenas es divisible por 11.

Pero, esto no debe hacerse.

Considere los números de dígitos pares con prefijo como [math] 22 [/ math].

Dado que este prefijo es divisible por [math] 11 [/ math], todas las cadenas que comiencen con él serán ignoradas y es inútil probarlas.

La idea de implementación correcta es mantener una cola de cifrados válidos y agregar repetidamente dígitos pares en la parte posterior y probar los sufijos de divisibilidad por [math] 11 [/ math].

Algoritmo:

1. Inicialice Q = {0}, cuenta = 0, lim = 1500000, ans = []

2. mientras Q no está vacío:

ttmp: = primer elemento en Q

para i en {0,2,4,6,8}

tmp = ttmp * 10 + i

res = no_suffix_of_tmp_for_divisibility_by_11

si res es verdadero y tmp> 0:

contar ++

ans.add (tmp)

Q.push (tmp)

si cuenta == lim:

break_out_of_while_loop

More Interesting

¿Cuál es una explicación simple de cómo ALS completa los valores donde antes existían ceros?

¿Cómo funciona este algoritmo para encontrar los bordes del corte mínimo de un gráfico?

¿Cuáles son algunas aplicaciones del algoritmo de clasificación de burbujas?

¿Cómo se copia el contenido de un árbol de búsqueda binario que tiene emparejamientos K, V?

¿Cuáles son las partes fáciles de la informática y cuáles son las partes difíciles?

¿Cuál es el lenguaje de programación más eficiente para diseñar algoritmos médicos?

¿Cómo hacen las ligas profesionales los horarios?

¿Qué algoritmo puedo usar para medir la correlación entre dos palabras?

¿Cómo podemos usar caché (s) para la optimización de la multiplicación de matrices?

¿Cómo se pueden condensar hipergrafías construidas para problemas de flujo de red que implican minimizar el tiempo necesario para impulsar el flujo desde la fuente al sumidero?

¿Debo postularme a trabajos de desarrollo web si puedo construir aplicaciones CRUD pero no asimilo la notación Big O y nunca he trabajado en un proyecto grupal?

¿Por qué la notación O grande no se parece más a O (c) y O (cn) en lugar de a O (1) y O (n), esto último no tiene sentido?

En los lenguajes de programación donde una matriz crece dinámicamente en tamaño, ¿no es una preocupación porque es O (n) complejidad de tiempo?

Cómo hacer búsquedas difusas eficientes usando la distancia levenshtein

¿Cuál sería el impacto económico de un algoritmo de compresión tan eficiente como el representado en Silicon Valley?