2의 거듭 제곱의 마지막 k 자리


16

정수 r , 마지막 r 자릿수가 각각 1 또는 2 인 2의 거듭 제곱 이 있습니다.

주어 r , 가장 작은 찾을 수 x 같은 그 2xmod10r 단지 1 또는 2로 구성되어 있습니다.

들면 r=2 , x=9 이후 29=512
r=3 , x=89 이후 289=618970019642690137449562112
참고 대해 r=4 , x=89 (다시)

입력 : r100

출력 : x

예 :

입력 : 2
출력 : 9

입력 : 3
출력 : 89

프로그램은 적당한 시간 내에 실행되어야합니다.

편집 :이 도전에 대한 oeis 시퀀스는 A147884 입니다.


2
이 작업의 OEIS는 A147884
Quixotic

@Debanjan, 그렇습니다. @
S.Mark,

효율적인 알고리즘을 설명하는 논문이 있습니다. 누군가 앞으로 나아갈 수 없다면 게시하겠습니다.
st0le

아, 고마워요!
YOU

@ st0le : 복잡성?
whacko__Cracko

답변:


4

파이썬, 166 자

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

잘 했어, Mark :) 나는 당신이 그것을 발견했다고 생각한다 :)
st0le

세미콜론을 사용하여 몇 바이트를 절약 할 수 있습니다. 161 bytes
movatica

2

Wolfram Language (Mathematica) , 78 76 57 55 바이트

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

온라인으로 사용해보십시오!

IntegerDigits[a,10,r]r마지막 10 진수 목록을 생성합니다 a. 3/2를 빼고 모두 -1/2 또는 +1/2인지 확인하십시오.

타이밍 확인 : TIO에서 20 초 동안 r = 1 .. 10 .

Wolfram Language (Mathematica) , 102 95 91 89 바이트

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

온라인으로 사용해보십시오!

이 솔루션은 훨씬 길지만 훨씬 빠릅니다. 에서 제안 경로 취함으로써 OEIS A147884을 통해 갈 OEIS A053312 뿐만 아니라 사용하여 FindInstance마법을, TIO는 계산 관리 r = 1 .. 12분 안에.


1

루비-118 자

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

하스켈, 115 자

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


1

05AB1E , 18 15 바이트

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

온라인으로 시도 하거나 처음 8 개의 테스트 사례를 확인하십시오 (더 이상 시간 초과).

설명:

사실을 사용 2엑스>아르 자형 가능한 모든 결과에 대해 마지막 숫자를 얻기에 충분한 숫자가 있는지 확인하십시오. 아르 자형 의 자릿수 2엑스.

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

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.