A tarefa é a seguinte. Dado um número inteiro x
(de modo que o x
módulo 100000000003
não seja igual a 0
) apresentado ao seu código da maneira que achar conveniente, imprima outro número inteiro y < 100000000003
para que (x * y) mod 100000000003 = 1
.
Seu código deve levar menos de 30 minutos para ser executado em uma máquina desktop padrão para qualquer entrada x
como essa |x| < 2^40
.
Casos de teste
Entrada: 400000001. Saída: 65991902837
Entrada: 4000000001. Saída: 68181818185
Entrada: 2. Saída: 50000000002
Entrada: 50000000002. Saída: 2.
Entrada: 1000000. Saída: 33333300001
Restrições
Você não pode usar nenhuma biblioteca ou função interna que execute módulo aritmético (ou esta operação inversa). Isso significa que você não pode nem ficar a % b
sem %
se implementar . No entanto, você pode usar todas as outras funções internas aritméticas não modulares.
Pergunta semelhante
Isso é semelhante a essa pergunta, embora seja esperançosamente diferente o suficiente para ainda ser interessante.
100000000003
? (me perguntando)Respostas:
Pitão, 24 bytes
Suíte de teste
Isso usa o fato de que um ^ (p-2) mod p = a ^ -1 mod p.
Primeiro, reimplemento manualmente o módulo, para o caso específico do mod 100000000003. Uso a fórmula
a mod b = a - (a/b)*b
, onde/
é a divisão com piso. Gero o módulo com10^11 + 3
, usando o código+3^T11
, em seguida salve-o eJ
, em seguida, use esta e a fórmula acima para calcular b mod 100000000003 com-b*/bJ+3^T11J
. Esta função é definida comoy
comL
.Em seguida, começo com a entrada, depois a levo para a décima potência e reduzo o mod 100000000003 e repito isso 11 vezes.
y^GT
é o código executado em cada etapa e ouy^GT11Q
executa 11 vezes, iniciando com a entrada.Agora eu tenho
Q^(10^11) mod 10^11 + 3
, e queroQ^(10^11 + 1) mod 10^11 + 3
, então multiplico pela entrada com*
, reduzo-o mod 100000000003 comy
uma última vez e com saída.fonte
Haskell ,
118113105101 bytesInspirado nesta solução .
-12 de Ørjan Johansen
Experimente online!
Haskell , 48 bytes
Uma reescrita desta solução . Embora rápida o suficiente para o vetor de teste, esta solução é muito lenta para outras entradas.
Experimente online!
fonte
g
um operador(e?b)a s|...
(2) Se você alternara
es
, em seguida, você pode fazer!
um não -Operador e em linhay
para ele. (3) Você pode se livrar do carowhere
com umlast
truque, ao custo de duplicarz
. Experimente online!|e==0=a
se livra dessa duplicação traquina.Braquilog , 22 bytes
Experimente online!
Isso levou cerca de 10 minutos para
1000000
uma versão ligeiramente diferente (e mais longa) do código, que era exatamente duas vezes mais rápida (verificou apenas valores positivos emİ
vez de positivos e negativos). Portanto, isso deve levar cerca de 20 minutos para concluir essa entrada.Explicação
Simplesmente descrevemos isso
Input × Output - 1 = 100000000003 × an integer
e deixamos que a aritmética da restrição encontreOutput
por nós.Tecnicamente, não precisamos da rotulagem explícita
≜
; no entanto, se não a usarmos,~×
não verificaremos o casoN = [100000000003,1]
(porque geralmente é inútil), o que significa que isso será muito lento para a entrada,2
por exemplo, porque será necessário encontrar o segundo menor inteiro em vez do primeiro.fonte
İ
, portanto isso ainda é muito lento para produtos grandes.Python,
535149585349 bytes-2 bytes graças a orlp
-2 bytes graças a officialaimm
-4 bytes graças a Felipe Nardi Batist
-3 bytes graças a isaacg
-1 byte graças a Ørjan Johansen
-2 bytes graças a Federico Poloni
Experimente Online!
Levei ~ 30 minutos para descobrir isso. Minha solução é começar com o primeiro número que será modificado para 1. Esse número é 1. Se é divisível por x, então y é esse número dividido por x. Caso contrário, adicione 10000000003 a este número para encontrar o segundo número que mod 1000000003 será igual a 1 e repita.
fonte
421385994
tempo limite.b
apenas uma vez, por que não codificá-lo?JavaScript (ES6),
153143141 bytesInspirado por esta resposta de math.stackexchange.com .
Uma função recursiva baseada no algoritmo euclidiano.
O módulo é implementado pela computação:
Como o quociente também é necessário, fazê-lo dessa maneira realmente faz algum sentido.
Casos de teste
Mostrar snippet de código
fonte
C ++ 11 (GCC / Clang, Linux),
104102 byteshttps://ideone.com/gp41rW
Ungolfed, baseado no teorema de Euler e na exponenciação binária.
fonte
long
pelo menos 32 bits, portanto, não pode necessariamente se manter1e11 + 3
. É de 32 bits no Windows x86-64.long
é um tipo de 64 bits no x86-64 Linux (e outros sistemas operacionais que usam a SystemV ABI). Portanto, para ser totalmente portátil, você precisará usar olong long
que é garantido em pelo menos 64 bits desde o C ++ 11 .__int128_t
não parece ser C ++ padrão, parece ser uma extensão do gcc, seria legal se você declarasse isso como uma linguagem (C ++ 11 + gcc).Mathematica, 49 bytes
fonte
PHP, 71 bytes
Casos de teste
fonte
Ruby , 58 bytes
Utiliza a aplicação de isaacg do pequeno teorema de Fermat por enquanto, enquanto termino de cronometrar a solução de força bruta.
Versão atual força bruta, que é de 47 bytes, mas
pode seré muito lento:Experimente online!
fonte