Últimos k dígitos de potencias de 2

16

Para cualquier número entero , existe una potencia de 2, cada uno de cuyos últimos dígitos son 1 o 2.rr

Dado , encuentre la más pequeña de modo que consista solo en 1 o 2.rx2xmod10r

Para r=2 , x=9 , ya que 29=512
Para r=3 , x=89 , ya que 289=618970019642690137449562112
Nota: para r=4 , x es =89 (nuevamente)

Entrada: r100

Salida: X

P.ej.

Entrada: 2
Salida: 9

Entrada: 3
Ouput: 89

El programa debe ejecutarse en un período de tiempo razonable.

EDITAR: La secuencia oeis para este desafío es A147884 .

st0le
fuente
2
El OEIS para esta tarea es A147884
Quixotic
@Debanjan, sí, cierto. @ S.Mark, potencias de 2, no 3.
estilo
Tengo un artículo que describe un algoritmo eficiente. Lo publicaré si alguien no puede seguir adelante con él.
st0le
ah, ok gracias!
@ st0le: ¿Complejidad?
whacko__Cracko

Respuestas:

4

Python, 166 caracteres

k,f,g=1,4,16
i=j=2
n=input()
m=10**n
a=lambda c:c('')-1-i or c('1')+c('2')-c('')+1
while i<=n:
 while a(str(j)[-i:].count):j,k=j*g%m,k+f
 i,g,f=i+1,g**5%m,f*5
print k

fuente
Buen
Puede guardar algunos bytes con punto y coma: 161 bytes
movatica
2

Wolfram Language (Mathematica) , 78 76 57 55 bytes

(x=0;While[Max@Abs[2IntegerDigits[2^++x,10,#]-3]>1];x)&

Pruébalo en línea!

IntegerDigits[a,10,r]genera una lista de los rúltimos dígitos decimales de a. Resta 3/2 y verifica que todos sean -1/2 o +1/2.

Verificación de tiempo: 20 segundos en TIO para r = 1 .. 10.

Wolfram Language (Mathematica) , 102 95 91 89 bytes

k/.FindInstance[Mod[n=0;Nest[#+10^n(2-Mod[#/2^n++,2])&,0,#]-2^k,5^#]==0,k,Integers][[1]]&

Pruébalo en línea!

Esta solución es mucho más larga pero mucho más rápida. Al tomar el camino sugerido en OEIS A147884 para ir a través de OEIS A053312 , además de usar FindInstancemagia, TIO logra calcular r = 1 .. 12en menos de un minuto.

romano
fuente
1

Ruby - 118 caracteres

k,f,g,m=1,4,16
i=j=2
m=10**(n=gets.to_i)
((k+=f;j=j*g%m)until j.to_s=~%r{[12]{#{i}}$};i+=1;f*=5;g=g**5%m)until n<i
p k
Dogbert
fuente
1

Haskell, 115 caracteres

import List
main=readLn>>=print. \r->head$findIndices(all(`elem`"12").take r.(++cycle"0").reverse.show)$iterate(*2)1
Thomas Eding
fuente
1

05AB1E , 18 15 bytes

∞.Δo©‹®I.£2X:`P

Pruébelo en línea o verifique los primeros 8 casos de prueba (más tiempos de espera).

Explicación:

Utiliza el hecho de que 2X>r para todos los resultados posibles, para garantizar que tengamos suficientes dígitos para obtener los últimos r dígitos de 2X .

∞.Δ            # Find the first positive integer x which is truthy (==1) for:
   o           #  Take 2 to the power the integer: 2^x
    ©          #  Store it in variable `®` (without popping)
              #  Check that it's larger than the (implicit) input: r < 2^x
               #  (1 if truhy; 0 if falsey)
    ®          #  Push variable `®` again: 2^x
     I       #  Only leave the last input amount of digits
        2X:    #  Replace all 2s with 1s
           `   #  Push all digits separated to the stack
    P          #  Take the product of all digits on the stack (including the earlier check)
               #  (NOTE: Only 1 is truthy in 05AB1E)
Kevin Cruijssen
fuente
0

CSharp - 111 caracteres

int a(int r){int x=1;a:x++;foreach(var c in Math.Pow(2,x)%Math.Pow(10,r)+"")if(c!='1'&&c!='2')goto a;return x;}
Robar
fuente
0

Julia 133122 (51) bytes

Inspirado por la respuesta de USTED:

n->(k=1;f=4;g=big(16);i=j=2;m=10^n;while i<=n;while digits!(fill(0,i),j)⊈1:2;j,k=j*g%m,k+f;end;i,g,f=i+1,g^5%m,f*5end;k)

Pruébalo en línea!

Lo siguiente es mucho más corto, pero se bloquea para r> 8, como algunas de las otras respuestas:

f(r,x=big(1))=digits!(fill(0,r),x)⊈1:2&&f(r,2x)+1

Pruébalo en línea!

usuario3263164
fuente