Задания
Версия для печати и копирования в MS Word
Тип 5 № 61351
i

Ал­го­ритм по­лу­ча­ет на вход на­ту­раль­ное число N и стро­ит по нему новое число R сле­ду­ю­щим об­ра­зом.

1.  Стро­ит­ся дво­ич­ная за­пись числа N.

2.  В конец дво­ич­ной за­пи­си до­бав­ля­ют­ся две цифры, со­от­вет­ству­ю­щие дво­ич­ной за­пи­си остат­ка от де­ле­ния ис­ход­но­го числа на 3.

3.  В конец дво­ич­ной за­пи­си числа, по­лу­чен­но­го на преды­ду­щем шаге, до­бав­ля­ют­ся три цифры, со­от­вет­ству­ю­щие дво­ич­ной за­пи­си остат­ка от де­ле­ния этого числа на 5.

4.  Ре­зуль­та­том ра­бо­ты ал­го­рит­ма ста­но­вит­ся де­ся­тич­ная за­пись по­лу­чен­но­го числа R.

 

При­мер. Дано число N  =  13. Ал­го­ритм ра­бо­та­ет сле­ду­ю­щим об­ра­зом:

1.  Стро­им дво­ич­ную за­пись: 1310  =  11012.

2.  Оста­ток от де­ле­ния 13 на 3 равен 1, до­бав­ля­ем к дво­ич­ной за­пи­си цифры 01, по­лу­ча­ем 1101012  =  5310.

3.  Оста­ток от де­ле­ния 53 на 5 равен 3, до­бав­ля­ем к дво­ич­ной за­пи­си цифры 011, по­лу­ча­ем 1101010112  =  42710.

4.  Ре­зуль­тат ра­бо­ты ал­го­рит­ма R  =  427.

 

Опре­де­ли­те ко­ли­че­ство при­над­ле­жа­щих от­рез­ку [1 111 111 110; 1 444 444 416] чисел, ко­то­рые могут по­лу­чить­ся в ре­зуль­та­те ра­бо­ты этого ал­го­рит­ма.

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

def f(n):

s2 = bin(n%3)[2:]

r = int(bin(n)[2:]+'0'*(2-len(s2))+s2,2)

s2 = bin(r%5)[2:]

return int(bin(r)[2:]+'0'*(3-len(s2))+s2,2)

 

a,b = 1111111110,1444444416

n = a//32-5

m = b//32-5

while f(n) < a: n+=1

while f(m) <= b: m+=1

print(m-n)

 

Ответ: 10416665.

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

def f(n):

r = n*4 + n%3

return r*8 + r%5

 

a,b = 1111111110,1444444416

n = a//32-5

m = b//32-5

while f(n) < a: n+=1

while f(m) <= b: m+=1

print(m-n)

 

При­ведём ре­ше­ние Бо­ри­са Са­ве­лье­ва на языке Python.

ans=0

for n in range (34_500_000,45_500_000):

s=bin(n)[2:]

if 1_111_111_110 <= int(bin(n)[2:]+'0'*(2-len(bin(n%3)[2:]))+bin(n%3)[2:]+'0'*(3-len(bin(int(s,2)%5)[2:]))+bin(int(s,2)%5)[2:],2) <= 1_444_444_416:

ans += 1

print(ans)

 

При­ведём ре­ше­ние Егора Чер­не­цо­ва на языке Python.

count = 0

for N in range(34722222, 45138889):

a = N % 3

b = (4 * N + a) % 5

R = 32 * N + 8 * a + b

if 1111111110 <= R <= 1444444416:

count += 1

print(count)


Аналоги к заданию № 61351: 61385 Все