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

Назовём мас­кой числа по­сле­до­ва­тель­ность цифр, в ко­то­рой также могут встре­чать­ся сле­ду­ю­щие сим­во­лы:

—  сим­вол «?» озна­ча­ет ровно одну про­из­воль­ную цифру;

—  сим­вол «*» озна­ча­ет любую по­сле­до­ва­тель­ность цифр про­из­воль­ной длины; в том числе «*» может за­да­вать и пу­стую по­сле­до­ва­тель­ность.

На­при­мер, маске 123*4?5 со­от­вет­ству­ют числа 123405 и 12300405.

Най­ди­те все на­ту­раль­ные числа, не пре­вос­хо­дя­щие 109, для ко­то­рых вы­пол­не­ны все усло­вия:

—  со­от­вет­ству­ют маске *31*65?;

—  де­лят­ся на 31 и 2031 без остат­ка;

—  ко­ли­че­ство де­ли­те­лей числа яв­ля­ет­ся ре­зуль­та­том любой сте­пе­ни двой­ки.

В от­ве­те за­пи­ши­те в пер­вом столб­це таб­ли­цы все най­ден­ные числа в по­ряд­ке воз­рас­та­ния, спра­ва от каж­до­го числа их част­ное от де­ле­ния на 2031.

 

Ответ:

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

Ре­ше­ние.

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

from fnmatch import *

sd = []

for i in range (1,20):

sd.append(2**i)

for x in range(0, 10**9, 31*2031):

if fnmatch(str(x), '*31*65?'):

delitel = []

for i in range(1, round (x**0.5) + 1):

if x%i==0:

delitel.append(i)

delitel.append(x // i)

if len(delitel) in sd:

print(x, x // 2031)

 

В ре­зуль­та­те ра­бо­ты про­грам­ма долж­на вы­ве­сти сле­ду­ю­щее:

53831655  26505

333126651  164021

512313657  252247

647931651  319021

831966654  409634

 

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

from fnmatch import *

for i in range(0,10**9+1,2031):

if fnmatch(str(i),'*31*65?') and i%31==0:

d=[]

for j in range(1,int(i**0.5)+1):

if i%j==0:

d.append(j)

if j!=(i//j):

d.append(i//j)

for x in range(100):

if len(d)==2**x:

print(i,i//2031)

break

 

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

import math

for i in range(0, 10**9, math.lcm(31, 2031)): #Для python 3.8 и рань­ше: for i in range(0, 10**9, abs(31*2031)//math.gcd(31, 2031), 2):

s = str(i)

if s[::-1][1:3] == '56' and '13' in s[::-1][3:]:

divCount = 1

for d in range(2, math.floor(math.sqrt(i))+1):

if i%d == 0:

divCount+=1

if divCount in [2**t for t in range(1, math.ceil(9*math.log2(10)))]: #10**9 >= 2**x <=> x <= 9*log₂10

print(i, i//2031)

 

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

import fnmatch,math

def deliteli(n):

d=set()

k=1

while k**2<=n:

if n%k==0: d|={k,n//k}

k+=1

return sorted(d)

twopower=[2**n for n in range(100)]

for n in range(0,10**9,31*2031//math.gcd(31,2031)):# шаг цикла - наи­мень­шее общее крат­ное

if fnmatch.fnmatch(str(n),'*31*65?') and len(deliteli(n)) in twopower:

print(n,n//2031)

Источник: ЕГЭ по ин­фор­ма­ти­ке 19.06.2023. Ос­нов­ная волна. Даль­ний Во­сток