Descrição do Desafio
Para todo número inteiro positivo n
existe um número que tem a forma de 111...10...000
que é divisível por, n
isto é, um número decimal que começa com todos 1
e termina com todos 0
. É muito fácil provar: se pegarmos um conjunto de n+1
números diferentes na forma de111...111
(todos 1
), pelo menos dois deles fornecerão o mesmo restante após a divisão por n
(conforme o princípio do buraco de pombo). A diferença desses dois números será divisível por n
e terá a forma desejada. Seu objetivo é escrever um programa que encontre esse número.
Descrição da entrada
Um número inteiro positivo.
Descrição da saída
Um número p
na forma de 111...10...000
, de modo quep ≡ 0 (mod n)
. Se você encontrar mais de um - exiba qualquer um deles (não precisa ser o menor).
Notas
Seu programa deve fornecer a resposta em um período de tempo razoável. O que significa que a força bruta não é permitida:
p = 0
while (p != 11..10.00 and p % n != 0)
p++
Nem é isso:
do
p = random_int()
while (p != 11..10.00 and p % n != 0)
A iteração pelos números na forma de 11..10..00
é permitida.
Seu programa não precisa lidar com uma entrada arbitrariamente grande - o limite superior é o limite superior do seu idioma.
Saídas de amostra
2: 10
3: 1110
12: 11100
49: 1111111111111111111111111111111111111111110
102: 1111111111111111111111111111111111111111111111110
fonte
1
e pelo menos um0
, caso contrário,0
é uma solução para qualquer entrada. (Seria bom esclarecer isso embora.)1
deve funcionar.Respostas:
Mathematica, 29 bytes
Código de Martin Büttner .
Na entrada
n
, isso gera o número com9*ϕ(n)
os seguidos den
zeros, ondeϕ
está a função totiente de Euler . Com uma funçãophi
, isso pode ser expresso em Python comoSeria suficiente usar o fatorial em
n!
vez deϕ(n)
, mas imprimir muitos deles não tem um tempo de execução razoável.Reivindicação:
9*ϕ(n)
uns seguidos den
zeros é um múltiplo den
.Prova: Primeiro, vamos provar isso para o caso de que
n
não é um múltiplo de2
,3
ou5
. Mostraremos que o número com consistência deϕ(n)
unidades é um múltiplo de `n.O número feito de
k
uns é igual(10^k-1)/9
. Comon
não é um múltiplo de3
, este é um múltiplon
desde que10^k-1
seja um fator den
, ou equivalente se10^k = 1 (mod n)
. Observe que essa formulação torna aparente que, sek
funcionar para o número de unidades, o mesmo ocorre com qualquer múltiplo dek
.Então, estamos procurando
k
ser um múltiplo da ordem dek
no módulo multiplicativo n . Pelo Teorema de Lagrange , qualquer ordem desse tipo é um divisor do tamanho do grupo. Como os elementos do grupo são o número de1
para on
que é relativamente primon
, seu tamanho é a função totiente de Eulerϕ(n)
. Então, nós mostramos isso10^ϕ(n) = 1 (mod n)
, e então o número feito deϕ(n)
um é um múltiplo de `n.Agora, vamos lidar com os fatores potenciais de
3
inn
. Sabemos que10^ϕ(n)-1
é um múltiplo den
, mas(10^ϕ(n)-1)/9
pode não ser. Mas,(10^(9*ϕ(n))-1)/9
é um múltiplo de9
porque consiste em9*ϕ(n)
uns, então a soma de seus dígitos é um múltiplo de9
. E observamos que multiplicando o expoentek
por uma constante preserva a divisibilidade.Agora, se
n
tiver fatores de2
's e5
' s, precisamos adicionar zeros ao final da saída. É mais do que suficiente usarn
zeros (de fatolog_2(n)
seria). Portanto, se nossa entradan
é dividida comon = 2^a * 5^b * m
, basta ter um9*ϕ(m)
para ser um múltiplo den
, multiplicado por10^n
um múltiplo de2^a * 5^b
. E, comon
é um múltiplo dem
, basta usá-los9*ϕ(n)
. Então, funciona para ter9*ϕ(n)
uns seguidos den
zeros.fonte
EulerPhi
função interna. Não há nada de alucinante na implementação real, então eu consideraria isso totalmente seu próprio trabalho.Python 2, 44 bytes
Quando
j
é uma potência de 10 como 1000, a divisão de pisoj/9
fornece um número feito de 1's como 111. Portanto,j/9*j
dá 1's seguidos por um número igual de 0s como 111000.A função testa recursivamente números dessa forma, tentando potências cada vez maiores de 10 até encontrarmos uma que seja um múltiplo do número desejado.
fonte
Pitão, 11 bytes
Suíte de teste
Basicamente, ele coloca um 1 na frente e um 0 na parte de trás uma e outra vez até que o número seja divisível pela entrada.
Explicação:
fonte
Haskell, 51 bytes
Usando a abordagem do xnor. nimi salvou um byte!
fonte
CJam,
282519 bytesSalva 6 bytes com a observação do xnor de que precisamos apenas olhar para os números do formulário .
1n0n
Teste aqui.
Explicação
fonte
Mathematica,
14055 bytesMuitos bytes foram removidos graças ao truque de 1 ^ n0 ^ n do xnor.
Valor mínimo,
140156 bytes Isso fornece a menor solução possível.Ele calcula quantos zeros são necessários e verifica todas as
1
contagens possíveis até que funcione. Ele pode gerar um número sem 0, mas que pode ser corrigido adicionando um<>"0"
antes da final&
.fonte
Haskell, 37 bytes
Isso usa o fato de que funciona para ter
9*phi(n)
uns, ondephi
está a função totiente de Euler. Aqui, ele é implementado usandogcd
e filtrando, produzindo um dígito para cada valori
que é relativamente primordial àquele que está no intervalo1
e9*n
. Também é suficiente usar tantos zeros.fonte
JavaScript (ES6), 65 bytes
Editar 2 bytes salvos thx @Neil
Ele funciona dentro dos limites do tipo numérico javascript, com 17 dígitos significativos. (Tão limitado)
Menos golfe
fonte
for(m=n;
?for(m=n;!m[16];)if(!((m+=0)%a))
.Perl 5, 26 bytes
inclui um byte para
-n
(-M5.01
é grátis)fonte
Sábio, 33 bytes
Isso usa o método do xnor para produzir a saída.
Experimente online
fonte
bc, 58 bytes
Resultados da amostra
fonte
dc, 27 bytes
Isso define uma função
f
que espera seu argumento na variáveln
. Para usá-lo como um programa,?sn lfx p
para ler a partir de stdin, chame a função e imprima o resultado em stdout. A variávelm
e o topo da pilha devem ser redefinidos para 10 (repetindoOdsm
) antes quef
possam ser reutilizados.Resultados:
fonte