Последние k цифр держав 2


16

Для любого целого числа , существует сила 2 каждая из которых в прошлом цифры 1 или 2.rr

Для заданного найдите наименьший такой, что состоит только из 1 или 2.rx2xmod10r

Для , , так как Для , , так как Примечание: для , является (снова)r=2x=929=512
r=3x=89289=618970019642690137449562112
r=4x=89

Ввод:r100

Выход: x

Например.

Ввод: 2
Выход: 9

Ввод: 3
Выход: 89

Программа должна запускаться в разумные сроки.

РЕДАКТИРОВАТЬ: oeis последовательность для этого вызова A147884 .


2
OEIS для этой задачи A147884
Quixotic

@Debanjan, да, правда. @ S.Mark, полномочия 2, а не 3.
st0le

У меня есть статья, в которой описан эффективный алгоритм. Я опубликую это, если кто-то не может продвинуться с этим.
st0le

ах, хорошо, спасибо!
ТЫ

@ 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

Отличная работа, Марк :) Полагаю, вы ее нашли :)
st0le

Вы можете сохранить несколько байтов, используя точки с запятой: 161 байт
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последних десятичных цифр a. Вычтите 3/2 и убедитесь, что они все либо -1/2, либо +1/2.

Проверка времени: 20 секунд на TIO для 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

Юлия 133 122 (51) байт

Вдохновленный ответом ВАС:

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)

Попробуйте онлайн!

Следующее намного короче, но вылетает при r> 8, как и некоторые другие ответы:

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

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.