2 Kuvvetlerinin son k hanesi


16

Herhangi bir r tamsayısı için , her biri son r hanesi 1 veya 2 olan 2'lik bir güç vardır .

rx2xmod10r

İçin , , çünkü için , için, Not: için , olduğu (tekrar)r=2x=929=512
r=3x=89289=618970019642690137449562112
r=4x=89

Giriş:r100

Çıktı:x

Örneğin.

Giriş: 2
Çıkış: 9

Giriş: 3
Çıkış: 89

Program makul bir süre içinde çalışmalıdır.

EDIT: Bu meydan okuma için oeis dizisi A147884'tür .


2
Bu görev için OEIS A147884
Quixotic

@Debanjan, evet doğru. @ S.Mark, 2'nin gücü, 3 değil.
st0le

Verimli bir algoritmayı tanımlayan bir makalem var. Birisi onunla ilerleyemezse gönderirim.
st0le

ah, tamam, teşekkürler!
SİZ

@ st0le: Karmaşıklık?
11:38

Yanıtlar:


4

Python, 166 karakter

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

İyi iş, Mark :) Sanırım buldun :)
st0le

Noktalı virgül kullanarak birkaç bayt kaydedebilirsiniz: 161 bayt
movatica

2

Wolfram Dili (Mathematica) , 78 76 57 55 bayt

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

Çevrimiçi deneyin!

IntegerDigits[a,10,r]öğesinin rson ondalık basamağının bir listesini oluşturur a. 3/2 çıkarın ve hepsinin -1/2 veya +1/2 olup olmadığını kontrol edin.

Zamanlama kontrolü: için TIO'da 20 saniye r = 1 .. 10.

Wolfram Dili (Mathematica) , 102 95 91 89 bayt

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

Çevrimiçi deneyin!

Bu çözüm çok daha uzun ama çok daha hızlı. Önerilen yol alarak OEIS A147884 yoluyla gitmek OEIS A053312 yanı sıra kullanarak FindInstancebüyü, TIO hesaplamak için yönetir r = 1 .. 12bir dakikadan az bir sürede.


1

Ruby - 118 karakter

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

1

Haskell, 115 karakter

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


1

05AB1E , 18 15 bayt

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

Çevrimiçi deneyin veya ilk 8 test vakasını doğrulayın (daha fazla zaman aşımı).

Açıklama:

2x>rr2x

∞.Δ            # 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)

0

CSharp - 111 karakter

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;}


0

Julia 133122 (51) bayt

SİZİN cevabından ilham alan:

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)

Çevrimiçi deneyin!

Aşağıdakiler çok daha kısadır, ancak diğer bazı cevaplar gibi r> 8 için kilitlenir:

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.