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

Ис­пол­ни­тель Раз­Два пре­об­ра­зу­ет число на экра­не. У ис­пол­ни­те­ля есть две ко­ман­ды, ко­то­рым при­сво­е­ны но­ме­ра.

1.  При­ба­вить 1.

2.  Умно­жить на 2.

Пер­вая ко­ман­да уве­ли­чи­ва­ет число на экра­не на 1, вто­рая умно­жа­ет его на 2. Про­грам­ма для ис­пол­ни­те­ля Раз­Два  — это по­сле­до­ва­тель­ность ко­манд.

Сколь­ко су­ще­ству­ет про­грамм, ко­то­рые пре­об­ра­зу­ют ис­ход­ное число 1 в число 20, и при этом тра­ек­то­рия вы­чис­ле­ний со­дер­жит ровно одно из чисел 9 и 10?

Тра­ек­то­рия вы­чис­ле­ний  — это по­сле­до­ва­тель­ность ре­зуль­та­тов вы­пол­не­ния всех ко­манд про­грам­мы. На­при­мер, для про­грам­мы 212 при ис­ход­ном числе 4 тра­ек­то­рия будет со­сто­ять из чисел 8, 9, 18.

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

Ре­ше­ние.

Ис­ко­мое ко­ли­че­ство про­грамм равно ко­ли­че­ству про­грамм, по­лу­ча­ю­щих из числа 1 число 20. Тра­ек­то­рия вы­чис­ле­ний не долж­на со­дер­жать число либо число 9, либо число 10.

Пусть R(n)  — ко­ли­че­ство про­грамм, ко­то­рые число 1 пре­об­ра­зу­ют в число n.

Верно сле­ду­ю­щее со­от­но­ше­ние:

R(n)  =  R(n – 1) + R(n : 2) (если n чётно).

Найдём ко­ли­че­ство про­грамм, пре­об­ра­зу­ю­щих число 1 в число 20, тра­ек­то­рия вы­чис­ле­ний долж­на со­дер­жать число 9, но не со­дер­жать число 10:

R(1)  =  1;

R(2)  =  2;

R(3)  =  2;

R(4)  =  4;

R(5)  =  4;

R(6)  =  6;

R(7)  =  6;

R(8)  =  10;

R(9)  =  10.

 

Из числа 9 число 20 можно по­лу­чить толь­ко по­сле­до­ва­тель­но­стью ко­манд 211, по­сколь­ку тра­ек­то­рия не долж­на со­дер­жать число 10.

 

Найдём ко­ли­че­ство про­грамм, пре­об­ра­зу­ю­щих число 1 в число 20, тра­ек­то­рия вы­чис­ле­ний долж­на со­дер­жать число 10, но не со­дер­жать число 9:

R(1)  =  1;

R(2)  =  2;

R(3)  =  2;

R(4)  =  4;

R(5)  =  4.

 

Из числа 5 число 20 можно по­лу­чить либо по­сле­до­ва­тель­но­стью ко­манд 22, либо по­сле­до­ва­тель­но­стью ко­манд 21..1, по­сколь­ку тра­ек­то­рия не долж­на со­дер­жать число 9. Зна­чит, всего ко­манд 4 · 2  =  8.

 

Таким об­ра­зом, ответ  — 10 + 8  =  18.

 

Ответ: 18.

 

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

def f(x, y):

if x > y or x == 10:

return 0

if x == y:

return 1

else:

return f(x + 1, y) + f(x * 2, y)

 

def f1(x, y):

if x > y or x == 9:

return 0

if x == y:

return 1

else:

return f1(x + 1, y) + f1(x * 2, y)

print(f(1, 9) * f(9, 20) + f1(1, 10) * f1(10, 20))


Аналоги к заданию № 29207: 27280 27307 27551 ... Все

Раздел кодификатора ФИПИ: 1.6.2 Вы­чис­ли­мость. Эк­ви­ва­лент­ность ал­го­рит­ми­че­ских мо­де­лей