Descripción del desafío
Para cada número entero positivo nexiste un número que tiene la forma de 111...10...000que es divisible por nej. Un número decimal que comienza con todos 1y termina con todos 0. Esto es muy fácil de probar: si tomamos un conjunto de n+1números diferentes en forma de 111...111(todos 1), al menos dos de ellos darán el mismo resto después de la división por n(según el principio del casillero). La diferencia de estos dos números será divisible por ny tendrá la forma deseada. Su objetivo es escribir un programa que encuentre este número.
Descripción de entrada
Un entero positivo.
Descripción de salida
Un número pen forma de 111...10...000tal que p ≡ 0 (mod n). Si encuentra más de uno, muestre cualquiera de ellos (no es necesario que sea el más pequeño).
Notas
Su programa tiene que dar la respuesta en un tiempo razonable. Lo que significa que la fuerza bruta no está permitida:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
Tampoco es esto:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
Iterar a través de los números en forma de 11..10..00está permitido.
Su programa no necesita manejar una entrada arbitrariamente grande: el límite superior es el límite superior de su idioma.
Resultados de muestra
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
fuente

1y al menos uno0, de lo contrario0es una solución para cualquier entrada. (Sería bueno aclarar esto sin embargo.)1debería funcionar.Respuestas:
Mathematica, 29 bytes
Código de Martin Büttner .
En la entrada
n, esto genera el número con9*ϕ(n)unos seguidos denceros, dondeϕestá la función totient de Euler . Con una funciónphi, esto podría expresarse en Python comoSería suficiente usar el factorial en
n!lugar deϕ(n), pero imprimir que muchos no tiene un tiempo de ejecución razonable.Reclamación:
9*ϕ(n)unos seguidos denceros es un múltiplo den.Prueba: En primer lugar, vamos a probar esto para el caso de que
nno es un múltiplo de2,3o5. Mostraremos que el número que consiste enϕ(n)unos es un múltiplo de `n.El número hecho de
kunos es igual(10^k-1)/9. Comonno es un múltiplo de3, este es un múltiplo denmientras10^k-1sea un factor den, o equivalentemente, si10^k = 1 (mod n). Tenga en cuenta que esta formulación hace evidente que sikfunciona para el número de unidades, entonces también lo hace cualquier múltiplo dek.Entonces, buscamos
kser un múltiplo del orden deken el grupo multiplicativo módulo n . Según el teorema de Lagrange , cualquier orden de este tipo es un divisor del tamaño del grupo. Dado que los elementos del grupo son el número de1anque son relativamente primos paran, su tamaño es la función totient Eulerϕ(n). Entonces, hemos demostrado eso10^ϕ(n) = 1 (mod n), y entonces el número hecho deϕ(n)unos es un múltiplo de `n.Ahora, manejemos los factores potenciales de
3inn. Sabemos que10^ϕ(n)-1es un múltiplo den, pero(10^ϕ(n)-1)/9podría no serlo. Pero,(10^(9*ϕ(n))-1)/9es un múltiplo de9porque consiste en9*ϕ(n)unos, por lo que la suma de sus dígitos es un múltiplo de9. Y hemos notado que multiplicar el exponentekpor una constante preserva la divisibilidad.Ahora, si
ntiene factores de2'sy5' s, necesitamos agregar ceros al final de la salida. Es mucho más que suficiente usarnceros (de hecholog_2(n)lo haría). Entonces, si nuestra entradanse divide comon = 2^a * 5^b * m, es suficiente tener9*ϕ(m)unos para ser múltiplo den, multiplicado por10^npara ser un múltiplo de2^a * 5^b. Y, dado quenes un múltiplo dem, es suficiente usar9*ϕ(n)unos. Entonces, funciona tener9*ϕ(n)unos seguidos denceros.fuente
EulerPhifunción incorporada. No hay nada alucinante en la implementación real, por lo que lo consideraría completamente su propio trabajo.Python 2, 44 bytes
Cuando
jes una potencia de 10 como 1000, la división de pisoj/9da un número compuesto de 1 como 111. Entonces,j/9*jda 1 seguido de un número igual de 0 como 111000.La función prueba recursivamente números de esta forma, probando potencias cada vez mayores de 10 hasta encontrar uno que sea múltiplo del número deseado.
fuente
Pyth, 11 bytes
Banco de pruebas
Básicamente, solo pone un 1 al frente y un 0 al revés una y otra vez hasta que el número sea divisible por la entrada.
Explicación:
fuente
Haskell, 51 bytes
Usando el enfoque de xnor. nimi guardó un byte!
fuente
CJam,
282519 bytesGuardamos 6 bytes con la observación de xnor de que solo necesitamos mirar los números del formulario .
1n0nPruébalo aquí.
Explicación
fuente
Mathematica,
14055 bytesMuchos bytes eliminados gracias al truco 1 ^ n0 ^ n de xnor.
Valor mínimo,
140156 bytes Esto da a la solución más pequeña posible.Calcula cuántos ceros son necesarios y luego verifica todos los
1recuentos posibles hasta que funcione. Puede generar un número sin 0 pero que se puede solucionar agregando un<>"0"derecho antes del final&.fuente
Haskell, 37 bytes
Esto utiliza el hecho de que funciona para tener
9*phi(n)unos, dondephiestá la función totient de Euler. Aquí, se implementa usandogcdy filtrando, produciendo un dígito para cada valorique es relativamente primo en el rango1y9*n. También es suficiente usar tantos ceros.fuente
JavaScript (ES6), 65 bytes
Editar 2 bytes guardados gracias a @Neil
Funciona dentro de los límites del tipo numérico javascript, con 17 dígitos significativos. (Muy limitado)
Menos golf
fuente
for(m=n;?for(m=n;!m[16];)if(!((m+=0)%a)).Perl 5, 26 bytes
incluye un byte para
-n(-M5.01es gratis)fuente
Sabio, 33 bytes
Esto usa el método de xnor para producir la salida.
Pruébalo en línea
fuente
a. C., 58 bytes
Resultados de muestra
fuente
dc, 27 bytes
Esto define una función
fque espera su argumento en la variablen. Para usarlo como un programa,?sn lfx ppara leer desde stdin, llame a la función e imprima el resultado en stdout. La variablemy la parte superior de la pila se deben restablecer a 10 (repitiendoOdsm) antes de quefse puedan reutilizar.Resultados:
fuente