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

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

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

2.  В конец дво­ич­ной за­пи­си до­бав­ля­ет­ся дво­ич­ный код остат­ка от де­ле­ния числа N на 4.

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

 

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

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

2.  Оста­ток от де­ле­ния 13 на 4 равен 1, до­бав­ля­ем к дво­ич­ной за­пи­си цифру 1, по­лу­ча­ем 110112  =  2710.

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

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

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

2.  Оста­ток от де­ле­ния 14 на 4 равен 2, до­бав­ля­ем к дво­ич­ной за­пи­си цифры 10 (102  =  210), по­лу­ча­ем 1110102  =  5810.

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

 

Назовём до­ступ­ны­ми числа, ко­то­рые могут по­лу­чить­ся в ре­зуль­та­те ра­бо­ты этого ал­го­рит­ма. На­при­мер, числа 27 и 58  — до­ступ­ные. Опре­де­ли­те ко­ли­че­ство до­ступ­ных чисел, при­над­ле­жа­щих от­рез­ку [1 000 000 000; 1 789 456 123].

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

Ре­ше­ние.

Воз­мож­ные остат­ки от де­ле­ния числа на 4  — это: 0, 1, 2, 3.

Рас­смот­рим, какие цифры будут на конце чисел, при де­ле­нии на 4 да­ю­щие оста­ток 0, 1, 2 или 3.

Оста­ток 0 при де­ле­нии на 4 дадут числа, дво­ич­ная за­пись ко­то­рых за­кан­чи­ва­ет­ся на 00, до­бав­ля­ем оста­ток 0. В ре­зуль­та­те ав­то­ма­та до­ступ­ное число будет окан­чи­вать­ся на 000. Сле­до­ва­нии при де­ле­нии на 8 дол­жен быть оста­ток 0.

Оста­ток 1 при де­ле­нии на 4 дадут числа, дво­ич­ная за­пись ко­то­рых за­кан­чи­ва­ет­ся на 01, до­бав­ля­ем оста­ток 1. В ре­зуль­та­те ав­то­ма­та до­ступ­ное число будет окан­чи­вать­ся на 011. Сле­до­ва­нии при де­ле­нии на 8 дол­жен быть оста­ток 3.

Оста­ток 2 при де­ле­нии на 4 дадут числа, дво­ич­ная за­пись ко­то­рых за­кан­чи­ва­ет­ся на 10, до­бав­ля­ем оста­ток 2 (10 в в дво­ич­ной за­пи­си). В ре­зуль­та­те ав­то­ма­та до­ступ­ное число будет окан­чи­вать­ся на 1010. Сле­до­ва­нии при де­ле­нии на 16 дол­жен быть оста­ток 10.

Оста­ток 3 при де­ле­нии на 4 дадут числа, дво­ич­ная за­пись ко­то­рых за­кан­чи­ва­ет­ся на 11, до­бав­ля­ем оста­ток 3 (11 в дво­ич­ной за­пи­си). В ре­зуль­та­те ав­то­ма­та до­ступ­ное число будет окан­чи­вать­ся на 1111. Сле­до­ва­нии при де­ле­нии на 16 дол­жен быть оста­ток 15.

По­счи­та­ем до­ступ­ные числа.

 

При­ведём ре­ше­ние на языке Python.

count = 0

for x in range(1_000_000_000, 1_789_456_123+1):

if x%16 in [10,15] or x%8 in [0,3]:

count += 1

print(count)

 

Ответ: 296046047.

 

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

def count_Ns(L, U, mod_value, multiplier, increment):

N_min = (L - increment + multiplier - 1) // multiplier

N_max = (U - increment) // multiplier

while N_min % 4 != mod_value:

N_min += 1

while N_max % 4 != mod_value:

N_max -= 1

if N_min > N_max:

return 0

return ((N_max - N_min) // 4) + 1

L = 1_000_000_000

U = 1_789_456_123

total_count = 0

total_count += count_Ns(L, U, mod_value=0, multiplier=2, increment=0)

total_count += count_Ns(L, U, mod_value=1, multiplier=2, increment=1)

total_count += count_Ns(L, U, mod_value=2, multiplier=4, increment=2)

total_count += count_Ns(L, U, mod_value=3, multiplier=4, increment=3)

print(total_count)

 

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

def ко­ли­че­ство(от,до,мно­жи­тель, оста­ток):

боль­ше­рав­но­от=((от-оста­ток-1)//мно­жи­тель+1)*мно­жи­тель+оста­ток

боль­ше­рав­но­до=((до-оста­ток-1)//мно­жи­тель+1)*мно­жи­тель+оста­ток

return (боль­ше­рав­но­до-боль­ше­рав­но­от)//мно­жи­тель

print(sum([ко­ли­че­ство(1000000000,1789456123+1,16,оста­ток) for оста­ток in [0,3,8,10,11,15]]))


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