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

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

F левая круг­лая скоб­ка n пра­вая круг­лая скоб­ка = n, если n мень­ше 9,

F левая круг­лая скоб­ка n пра­вая круг­лая скоб­ка = F левая круг­лая скоб­ка n mod 9 пра­вая круг­лая скоб­ка плюс F левая круг­лая скоб­ка n div 9 пра­вая круг­лая скоб­ка , если n боль­ше = 9.

 

Опре­де­ли­те ко­ли­че­ство зна­че­ний n на от­рез­ке [4 · 620; 5 · 620], для ко­то­рых F левая круг­лая скоб­ка n пра­вая круг­лая скоб­ка = 121.

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

Ре­ше­ние.

from functools import *

 

def f(n, b):

# гра­нич­ное зна­че­ние в b-ичной сс

a = []

while n > 0:

a = [n % b] + a

n //= b

 

@cache

def g(s, l, fl):

# если по­сле­до­ва­тель­ность нуж­ной длины, про­ве­ря­ем, что сумма нам под­хо­дит,

# и вы­хо­дим из ре­кур­сии.

if l == 0: return s == 121

 

# про­ве­ря­ем огра­ни­чен­ные под­по­сле­до­ва­тель­но­сти боль­шей длины

return sum(g(s+x, l-1, fl and (x == a[-l])) for x in range([b, a[-l]+1][fl]))

 

return g(0, len(a), 1)

 

# ответ - раз­ность между ко­ли­че­ством под­хо­дя­щих чисел на от­рез­ке [1; 5*6^20] и по­лу­ин­тер­ва­ле [1; 4*6^20).

print(f(5*6**20, 9) - f(4*6**20-1, 9))

 

Ответ: 194257368.


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

Источник/автор: Семён Чайкин