Processing math: 100%

14 votos

Cómo encontrar el número más pequeño con sólo 0 y 1 que se divide por un número determinado?

Todo entero positivo divide algún número cuya representación (base 10 ) sólo contiene ceros y unos. Se puede demostrar fácilmente utilizando el principio de encasillamiento.

Some examples:
2 -> 10
3 -> 111
4 -> 100
...

Pero, ¿cómo encontrar la respuesta más pequeña? ¿Hay alguna manera de encontrarla de forma eficiente?

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.

17voto

Mike Powell Puntos 2913

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 km 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++10im0modn.

En otras palabras, quieres encontrar un conjunto de posiciones ij (un subconjunto de {0,1,2,,k1} ) 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: 1001mod7possible sums: 1101103mod7possible sums: 1,3,410210×3302mod7possible sums: 1,2,3,4,5,610310×2206mod7STOP. Usted tiene 1+60mod7 , 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 r1 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: 10210019mod27sums: 1910310×1919001mod27sums: 19,1,2010410×110mod27sums: 1,19,20,10,11,(29)2,(30)310519mod27sums: 1,2,3,10,11,19,20,21,22,(39)121061mod27sums: 1,2,3,10,11,12,19,20,21,22,4,13,2310710mod27sums: 1..4,10..13,19..23,14,5,610819mod27sums: 1..6,10..14,19..23,24,25,151091mod27sums: 1..6,10..15,19..25,7,16,26101010mod27sums: 1..7,10..16,19..26,17,8,9101119mod27sums: 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): 01011+81011+1010+251011+1010+108+61011+1010+108+107+231011+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.

0 votos

Pero alguien puede resolverlo con n<=10^9 en 3 segundos...Ver(Es una página china): 51nod.com/onlineJudge/questionCode.html#!problemId=1111

0 votos

Estoy seguro de que este algo puede ser optimizado para O(nϕ(n)) porque no es el verdadero problema de la suma de subconjuntos. Así que si la entrada es lo suficientemente buena, esto funcionará bastante rápido.

0 votos

Dang. Esta es una buena respuesta. +1

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X