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

Ал­го­ритм вы­чис­ле­ния зна­че­ния функ­ции F(n), где n  — целое не­от­ри­ца­тель­ное число, задан сле­ду­ю­щи­ми со­от­но­ше­ни­я­ми:

F(0)  =  0;

F(n)  =  F(n − 1) + 1, если n нечётно;

F(n)  =  F(n / 2), если n > 0 и при этом n чётно.

 

Ука­жи­те ко­ли­че­ство таких зна­че­ний n < 1 000 000 000, для ко­то­рых F(n)  =  3.

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

Ре­ше­ние.

За­ме­тим, что дан­ная ре­кур­сив­ная функ­ция фак­ти­че­ски под­счи­ты­ва­ет ко­ли­че­ство еди­ниц в числе n в дво­ич­ном виде. Тогда не­об­хо­ди­мо найти ко­ли­че­ство чисел в за­дан­ном диа­па­зо­не, ко­то­рые в дво­ич­ном виде имеют толь­ко три цифры 1. То есть, под­хо­дят числа вида 111, 1011, 1101, 1110 и так далее. Число 1 000 000 000 в дво­ич­ном виде имеет 30 зна­ков. То есть не­об­хо­ди­мо раз­ме­стить три еди­ни­цы среди 30 по­зи­ций всеми воз­мож­ны­ми спо­со­ба­ми. Вос­поль­зу­ем­ся фор­му­лой вы­чис­ле­ния со­че­та­ний из 30 по­зи­ций по 3:

 дробь: чис­ли­тель: 30!, зна­ме­на­тель: 27! умно­жить на 3! конец дроби = дробь: чис­ли­тель: 28 умно­жить на 29 умно­жить на 30, зна­ме­на­тель: 2 умно­жить на 3 конец дроби =4060.

Ответ: 4060.

 

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

cnt=0

for i in range (2,100):

for j in range (0,i):

for k in range (0,j):

if (2**i+2**j+2**k)<1000000000:

cnt+=1

print(cnt)


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