Задания
Версия для печати и копирования в MS Word

Най­ди­те все на­ту­раль­ные числа, при­над­ле­жа­щие от­рез­ку [35 000 000; 40 000 000], у ко­то­рых ровно пять раз­лич­ных нечётных де­ли­те­лей (ко­ли­че­ство чётных де­ли­те­лей может быть любым). В от­ве­те пе­ре­чис­ли­те най­ден­ные числа в по­ряд­ке воз­рас­та­ния.

Ответ:

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

Ре­ше­ние.

Решим за­да­чу пе­ре­бо­ром. На­хо­дя оче­ред­ной де­ли­тель числа, будем про­ве­рять, яв­ля­ет­ся ли этот де­ли­тель нечётным, и, если яв­ля­ет­ся, будем при­бав­лять к пе­ре­мен­ной count еди­ни­цу. Также за­ме­тим, что у каж­до­го де­ли­те­ля числа есть пар­ный де­ли­тель  — если он нечётный, будем при­бав­лять к пе­ре­ме­ной count еди­ни­цу. Также учтём то, что у числа может быть 2 оди­на­ко­вых де­ли­те­ля (на­при­мер, у числа 9 два оди­на­ко­вых де­ли­те­ля  — числа 3 и 3).

 

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

var

count, i, j, k, sqrtI: longint;

begin

for i := 35000000 to 40000000 do begin

count := 0;

sqrtI := round(sqrt(i));

for j := 1 to sqrtI do begin

if i mod j = 0 then begin

if j mod 2 = 1 then count := count + 1;

k := i div j;

if k mod 2 = 1 then begin

count:=count + 1;

if j = k then count:=count - 1;

end;

end;

if count > 5 then break;

end;

if count = 5 then writeln(i);

end;

end.

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

35819648

38950081

39037448

39337984

 

При­ве­дем дру­гое ре­ше­ние.

Число имеет ровно пять не­чет­ных де­ли­те­лей, если оно имеет вид 2n · p4, где p   — про­стое число, n  — про­из­воль­ное на­ту­раль­ное число. В этом слу­чае не­чет­ны­ми де­ли­те­ля­ми числа будут числа 1, p, p2, p3 и p4. Сле­до­ва­тель­но, можно ис­кать ко­рень чет­вер­той сте­пе­ни из числа, де­лен­но­го на мак­си­маль­но воз­мож­ную сте­пень двой­ки. Если этот ко­рень чет­вер­той сте­пе­ни яв­ля­ет­ся про­стым чис­лом, то само число имеет ровно пять не­чет­ных де­ли­те­лей.

 

При­ве­дем про­грам­му на языке Pascal, ре­а­ли­зу­ю­щую этот спо­соб.

var

simple, i, j, c, sqrtI: longint;

begin

for i := 35000000 to 40000000 do begin

c:=i;

while c mod 2 = 0 do begin

c:=c div 2;

end;

sqrtI := round(sqrt(c));

sqrtI:= round(sqrt(sqrtI));

if sqrtI * sqrtI * sqrtI * sqrtI = c then begin

simple:=1;

for j:=3 to round(sqrt(sqrtI)) do begin

if sqrtI mod j=0 then begin

simple:=0;

break;

end;

end;

if simple=1 then writeln(i);

end;

end;

end.

 

При­ве­дем ма­те­ма­ти­че­ское обос­но­ва­ние дан­но­го спо­со­ба.

Пусть раз­ло­же­ние числа m на про­стые мно­жи­те­ли имеет вид m=a_0 в сте­пе­ни левая круг­лая скоб­ка k_0 пра­вая круг­лая скоб­ка a_1 в сте­пе­ни левая круг­лая скоб­ка k_1 пра­вая круг­лая скоб­ка ...a_n в сте­пе­ни левая круг­лая скоб­ка k_n пра­вая круг­лая скоб­ка , тогда ко­ли­че­ство де­ли­те­лей числа m равно  левая круг­лая скоб­ка k_0 плюс 1 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_1 плюс 1 пра­вая круг­лая скоб­ка ... левая круг­лая скоб­ка k_n плюс 1 пра­вая круг­лая скоб­ка . В част­но­сти, чет­ное число рас­кла­ды­ва­ет­ся на мно­жи­те­ли как 2 в сте­пе­ни левая круг­лая скоб­ка k_0 пра­вая круг­лая скоб­ка a_1 в сте­пе­ни левая круг­лая скоб­ка k_1 пра­вая круг­лая скоб­ка ...a_n в сте­пе­ни левая круг­лая скоб­ка k_n пра­вая круг­лая скоб­ка , где мно­жи­те­ли ai  — не­чет­ные числа. Тогда число имеет  левая круг­лая скоб­ка k_0 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_1 плюс 1 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_2 плюс 1 пра­вая круг­лая скоб­ка ... левая круг­лая скоб­ка k_n плюс 1 пра­вая круг­лая скоб­ка чет­ных де­ли­те­лей и  левая круг­лая скоб­ка k_1 плюс 1 пра­вая круг­лая скоб­ка умно­жить на левая круг­лая скоб­ка k_2 плюс 1 пра­вая круг­лая скоб­ка ... левая круг­лая скоб­ка k_n плюс 1 пра­вая круг­лая скоб­ка не­чет­ных.

По усло­вию за­да­чи тре­бу­ет­ся, чтобы число имело 5 не­чет­ных де­ли­те­лей. Число 5 можно пред­ста­вить в виде про­из­ве­де­ния един­ствен­ным спо­со­бом 1 · (4 + 1), сле­до­ва­тель­но, раз­ло­же­ние ис­ко­мо­го числа на про­стые мно­жи­те­ли долж­но иметь вид 2n · p4.

 

При­ме­ча­ние Ни­ки­ты Сте­па­но­ва.

Вто­рой спо­соб ре­ше­ния будет да­вать не­вер­ный ре­зуль­тат, если в за­дан­ном диа­па­зо­не есть число, яв­ля­ю­ще­е­ся сте­пе­нью двой­ки. В этом слу­чае по­лу­чим sqrtI = c  =  1, цикл про­вер­ки де­ли­мо­сти числа не вы­пол­нит­ся ни разу, и пе­ре­мен­ная simple оста­нет­ся рав­ной 1. Предо­став­ля­ем чи­та­те­лям воз­мож­ность найти спо­соб устра­не­ния этого не­до­стат­ка.

 

При­ведём ре­ше­ние Вла­ди­ми­ра Лу­кьян­чи­ко­ва на языке Pascal.

uses school;

for var i := 35000000 to 40000000 do

if i.Divisors.Where(x -> x mod 2 = 1).Count = 5 then println(i);

 

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

def isPrime(n):

r = n%2 + 1

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

if n % i==0: return False

return True

start, end = 35_000_000, 40_000_000

for i in range(start, end+1):

n = i

while n%2 == 0: n //= 2

q = round(n**0.25)

if n == q**4 and isPrime(q):

print(i)

 

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

def prime(n):

k = 2

while k**2 <= n:

if n%k == 0:

return False

k += 1

return True

bot,top = 35000000,40000000

mp = int(top**0.25)+3

m2 = len(bin(top))

nums = [p**4*2**m for p in range(3,mp,2) for m in range(m2) if prime(p) and bot <= p**4*2**m <= top]

for n in sorted(nums):

print(n)


Аналоги к заданию № 33527: 33770 35483 35914 Все

Раздел кодификатора ФИПИ: