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

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

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

F левая круг­лая скоб­ка n пра­вая круг­лая скоб­ка = F левая круг­лая скоб­ка n mod 15 пра­вая круг­лая скоб­ка умно­жить на F левая круг­лая скоб­ка n div 15 пра­вая круг­лая скоб­ка , если n боль­ше = 15.

 

Опре­де­ли­те ко­ли­че­ство зна­че­ний n, не пре­вы­ша­ю­щих 340, для ко­то­рых F левая круг­лая скоб­ка n пра­вая круг­лая скоб­ка = 7560.

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

Ре­ше­ние.

При­ве­дем ре­ше­ние Мак­си­ма Ба­ла­ки­ре­ва (Бел­го­род) на языке python.

from functools import *

 

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

n = 3 ** 40

a = []

while n > 0:

a = [n % 15] + a

n //= 15

 

@cache

def f(p, l, fl, zero):

# если про­из­ве­де­ние боль­ше нуж­но­го, по­сле­до­ва­тель­ность ни­ко­гда не по­дойдёт.

if p > 7560: return 0

 

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

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

if l == 0: return p == 7560

 

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

# zero=1 озна­ча­ет, что до этого мы ста­ви­ли толь­ко нули (тогда если ста­вим новый 0, то про­из­ве­де­ние ме­нять не нужно)

return sum(f(p * (max(x, 1) if zero else x), l - 1, fl and (x == a[-l]), zero and (x == 0)) for x in range([15, a[-l] + 1][fl]))

 

 

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

print(f(1, len(a), 1, 1))

 

Ответ: 311880322.

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