Se le da n y quiere encontrar un número con sólo 1 s y 0 s, que es divisible por n . Que el menor de estos números tenga k dígitos. Hay una evidente O(min(n,2k)) y no creo que haya ningún algoritmo asintóticamente mejor que éste en el peor de los casos.
Supongamos que hay un número k dígitos, que sólo tiene dígitos 0 s y 1 s. Si hay m posiciones i1,i2,…,im que tienen 1 s, y el resto de k−m posiciones tienen 0 s, entonces el número es 10i1+10i2+⋯+10im . Esto lo quieres divisible por n , así que modulo n , usted quiere 10i1+10i2+⋯+10im≡0modn.
En otras palabras, quieres encontrar un conjunto de posiciones ij (un subconjunto de {0,1,2,…,k−1} ) tal que la suma de los valores correspondientes es 0 cuando se trabaja con el módulo n . Esto se reduce a la problema de la suma de subconjuntos / problema de la mochila que son conocidos por su dureza. Esto no demuestra que este problema sea difícil (la reducción es en la dirección equivocada), pero uno podría suponer que este problema es igualmente difícil: el hecho de que los valores vengan como potencias de 10 probablemente no tenga ninguna estructura útil que explotar.
En fin, el método:
- Evaluar las potencias de 10 modulo n uno por uno.
- En cada etapa, lleve la cuenta de todas las posibles sumas de subconjuntos alcanzables de los valores vistos hasta el momento. Algorítmicamente, esto es: todas las sumas alcanzables anteriormente, junto con el nuevo valor por sí mismo, y el último valor añadido a cada una de las sub-sumas alcanzables anteriormente.
- Cuando se tiene un subconjunto-suma con valor 0 modulo n para. Has encontrado el número más pequeño.
Algunos ejemplos concretos. Por ejemplo, n=7 . Los poderes de 10 son: 100≡1mod7possible sums: 1101≡10≡3mod7possible sums: 1,3,4102≡10×3≡30≡2mod7possible sums: 1,2,3,4,5,6103≡10×2≡20≡6mod7STOP. Usted tiene 1+6≡0mod7 , por lo que el número más pequeño es 100+103=1001 . Obsérvese que aunque para concretar he enumerado todas las sumas posibles en cada etapa, en la práctica, si se hace a mano, la mente recurre automáticamente a varias heurísticas que hacen innecesario explorar todas las sumas sistemáticamente: por ejemplo, hasta la última etapa, la mayor suma posible era 1+3+2<7 Así que podríamos pasar a la siguiente etapa sin evaluar (todavía) todas las sumas posibles.
Para algunos valores especiales de n Pero hay algunos atajos que podemos utilizar para acelerar el proceso (aunque no nos ayudarán con el análisis del peor caso). Por ejemplo, si n es divisible por 2 o 5 , dejemos que r sea la mayor potencia de cualquiera de ellos dividiéndola. (Es decir, r es el mayor número entero tal que 2r|n o 5r|n .) Entonces sabemos inmediatamente que el último r Los dígitos de la respuesta deben ser todos 0 s. (Prueba por inducción: El último dígito no puede ser 1 , por lo que tiene que ser 0 . Después, dividiendo la respuesta en todo por 10 (quitando el último dígito básicamente), queremos una respuesta correspondiente a r−1 etc.) Así que podemos establecer el último r dígitos a 0 (que da la divisibilidad por 10r y por lo tanto por ambos 2r y 5r ), y concentrarse en el resto de los dígitos, pues el "resto de" n . Por ejemplo, cuando n=2×52×33=1350 podemos ver que los dos últimos dígitos deben ser 0 y entonces es un problema sólo para el 33=27 parte de n . La respuesta para 27 es 1101111111 por lo que si hemos precalculado la respuesta para 27 podemos decir directamente que la respuesta para 1350 es 110111111100 pero sólo para mostrar el trabajo: 102≡100≡19mod27sums: 19103≡10×19≡190≡01mod27sums: 19,1,20104≡10×1≡10mod27sums: 1,19,20,10,11,(29≡)2,(30≡)3105≡19mod27sums: 1,2,3,10,11,19,20,21,22,(39≡)12106≡1mod27sums: 1,2,3,10,11,12,19,20,21,22,4,13,23107≡10mod27sums: 1..4,10..13,19..23,14,5,6108≡19mod27sums: 1..6,10..14,19..23,24,25,15109≡1mod27sums: 1..6,10..15,19..25,7,16,261010≡10mod27sums: 1..7,10..16,19..26,17,8,91011≡19mod27sums: 1..9,10..17,19..26,0,1,18STOP. Por lo tanto, modulo 27 tenemos (desandando el camino por el que llegamos a 0 , que si lo hiciéramos por ordenador almacenaríamos mientras generamos las sumas): 0≡1011+8≡1011+1010+25≡1011+1010+108+6≡1011+1010+108+107+23…≡1011+1010+108+107+106+105+104+103+102 por lo que el número más pequeño formado por sólo 0 y 1 s que es divisible por 1350 es 110111111100=1350×81563786.
1 votos
Esencialmente lo mismo que math.stackexchange.com/questions/164986/
0 votos
@ErickWong: No es la misma pregunta. Aparentemente la respuesta de algorithmshark parece una parcial respuesta a esto.
1 votos
La secuencia está tabulada en oeis.org/A004290 --- hay un enlace a mathpuzzle.com/Binary.html donde se da un algoritmo simple y eficiente.
0 votos
@GerryMyerson Gracias, pero estoy buscando una manera de resolver n es alrededor de 109
1 votos
Agrego la ficha del Proyecto Euler para aquellos que deseen evitar los spoilers.
0 votos
Creo que puedes encontrar que el algoritmo en ese enlace funciona bien en 109 . @Mike, ¿dices que se trata de un problema de proyecto-euler? ¿Puedes proporcionar un enlace, o al menos un número?
0 votos
@GerryMyerson Se requiere alrededor de 4G de memoria ... Es demasiado grande para mí ..
0 votos
@GerryMyerson No había querido anunciar cuál era el problema, pero si compruebas el historial de ediciones, allí lo expuse.
0 votos
@Mike, gracias. Hay una política aquí (en la medida en que se puede decir que m.se tiene una política sobre cualquier cosa) de no permitir problemas de proyecto-euler. Pero el problema PE no es exactamente el problema aquí, ya que el problema PE permite el dígito 2. El problema PE se discutió en stackoverflow.com/questions/7291031/
0 votos
Este enlace probablemente responderá a su pregunta<br> math.stackexchange.com/questions/388165/
0 votos
@Sayakiss: relacionado: math.stackexchange.com/questions/83932