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

На вход про­грам­мы по­сту­па­ет по­сле­до­ва­тель­ность из N целых по­ло­жи­тель­ных чисел. Рас­смат­ри­ва­ют­ся все пары раз­лич­ных эле­мен­тов по­сле­до­ва­тель­но­сти (эле­мен­ты пары не обя­за­ны сто­ять в по­сле­до­ва­тель­но­сти рядом, по­ря­док эле­мен­тов в паре не важен). Не­об­хо­ди­мо опре­де­лить ко­ли­че­ство пар, для ко­то­рых про­из­ве­де­ние эле­мен­тов де­лит­ся на 26.

В пер­вой стро­ке вход­ных дан­ных задаётся ко­ли­че­ство чисел N (1 ≤ N ≤ 60 000). В каж­дой из по­сле­ду­ю­щих N строк за­пи­са­но одно целое по­ло­жи­тель­ное число, не пре­вы­ша­ю­щее 10 000. В ка­че­стве ре­зуль­та­та про­грам­ма долж­на на­пе­ча­тать одно число: ко­ли­че­ство пар, в ко­то­рых про­из­ве­де­ние эле­мен­тов крат­но 26.

Вход­ные дан­ные.

Файл A

Файл B

Даны два вход­ных файла (файл A и файл B), каж­дый из ко­то­рых со­дер­жит в пер­вой стро­ке ко­ли­че­ство чисел N (1 ≤ N ≤ 60 000). В каж­дой из по­сле­ду­ю­щих N строк за­пи­са­но одно на­ту­раль­ное число, не пре­вы­ша­ю­щее 10 000.

При­мер ор­га­ни­за­ции ис­ход­ных дан­ных во вход­ном файле:

4

2

6

13

39

При­мер вы­ход­ных дан­ных для при­ведённого выше при­ме­ра вход­ных дан­ных:

4

В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой суммы для файла А, затем для файла B.

 

Ответ:

 

По­яс­не­ние. Из четырёх за­дан­ных чисел можно со­ста­вить 6 по­пар­ных про­из­ве­де­ний: 2 · 6, 2 · 13, 2 · 39, 6 · 13, 6 · 39, 13 · 39 (ре­зуль­та­ты: 12, 26, 78, 78, 234, 507). Из них на 26 де­лят­ся 4 про­из­ве­де­ния (2 · 13  =  26; 2 · 39  =  78; 6 · 13  =  78; 6 · 39  =  234).

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

Ре­ше­ние.

Про­из­ве­де­ние двух чисел де­лит­ся на 26, если вы­пол­не­но одно из сле­ду­ю­щих усло­вий (усло­вия не могут вы­пол­нять­ся од­но­вре­мен­но).

А.  Оба со­мно­жи­те­ля де­лят­ся на 26.

Б.  Один из со­мно­жи­те­лей де­лит­ся на 26, а дру­гой не де­лит­ся.

В.  Ни один из со­мно­жи­те­лей не де­лит­ся на 26, но один со­мно­жи­тель де­лит­ся на 2, а дру­гой  — на 13.

При­ме­ча­ние для про­ве­ря­ю­ще­го. Усло­вие де­ли­мо­сти про­из­ве­де­ния на 26 можно сфор­му­ли­ро­вать проще, на­при­мер так: (один из со­мно­жи­те­лей де­лит­ся на 26) ИЛИ (один со­мно­жи­тель де­лит­ся на 2, а дру­гой  — на 13). Но в этом слу­чае пара со­мно­жи­те­лей может удо­вле­тво­рять обоим усло­ви­ям, что за­труд­нит подсчёт ко­ли­че­ства пар.

При вводе чисел можно опре­де­лять, де­лит­ся ли каж­дое из них на 26, 2 и 13, и под­счи­ты­вать сле­ду­ю­щие зна­че­ния:

1)  n26  — ко­ли­че­ство чисел, крат­ных 26;

2)  n13  — ко­ли­че­ство чисел, крат­ных 13, но не крат­ных 26;

3)  n2  — ко­ли­че­ство чисел, крат­ных 2, но не крат­ных 26.

При­ме­ча­ние для про­ве­ря­ю­ще­го. Сами числа при этом можно не хра­нить. Каж­дое число учи­ты­ва­ет­ся не более чем в одном из счётчи­ков. Ко­ли­че­ство пар, удо­вле­тво­ря­ю­щих усло­вию А, можно вы­чис­лить по фор­му­ле n26 · (n26 – 1) : 2.

Ко­ли­че­ство пар, удо­вле­тво­ря­ю­щих усло­вию Б, можно вы­чис­лить по фор­му­ле n26 · (N – n26).

Ко­ли­че­ство пар, удо­вле­тво­ря­ю­щих усло­вию В, можно вы­чис­лить по фор­му­ле n2 · n13.

По­это­му ис­ко­мое ко­ли­че­ство пар вы­чис­ля­ет­ся по фор­му­ле n26 · (n26 – 1) : 2 + n26 · (N – n26) + n2 · n13.

 

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

var

N: integer; {ко­ли­че­ство чисел}

a: integer; {оче­ред­ное число}

n26, n13, n2: integer;

k26: integer; {ко­ли­че­ство тре­бу­е­мых пар}

i: integer;

f: text;

begin

n26:=0; n13:=0; n2:=0;

assign(f,'27989_A.txt');

reset(f);

readln(f, n);

for i := 1 to n do begin

readln(f, a);

if a mod 26 = 0 then

n26 := n26+1

else if a mod 13 = 0 then

n13 := n13 + 1

else if a mod 2 = 0 then

n2 := n2 + 1;

end;

k26 := n26*(n26-1) div 2 + n26*(N-n26) + n2*n13;

writeln(k26)

end.

 

При­ведём ре­ше­ние Ми­ха­и­ла Бур­ми­ст­ро­ва на языке PascalABC.

var f:text;

a: array [1..100000] of integer;

n,i,j,p,count:integer;

begin

assign(f,'C:\27989_A.txt');

reset(f);

readln(f,n);

for i:=1 to n do readln(f,a[i]);

for i:=1 to n-1 do

for j:=i+1 to n do begin

p:=a[i]*a[j];

if p mod 26 =0 then inc(count);

end;

writeln(count);

end.

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 19, из файла B  — 199360639.

 

При­ме­ча­ние.

Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

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

f = open("27989_B.txt") # для файла A ука­жи­те его на­зва­ние

s = f.readlines()

n = int(s[0])

k = 0

k_0 = 0

k_26 = 0

k_2 = 0

k_13 = 0

for i in range(1, n + 1):

s[i] = int(s[i])

if s[i] % 26 == 0:

k_26 += 1

elif s[i] % 13 == 0:

k_13 += 1

elif s[i] % 2 == 0:

k_2 += 1

else:

k_0 += 1

k = k_26 * k_0 + k_13 * k_2 + k_26 * k_13 + k_26 * k_2 + (k_26 * (k_26 - 1)) // 2

print(k)

 

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

#Ре­ше­ние на пи­то­не, под­счет чисел с раз­ной де­ли­мо­стью:

a=[int(s) for s in open('27989_B.txt')][1:]

m2=len([x for x in a if x%2==0 and x%13!=0])

m13=len([x for x in a if x%13==0 and x%2!=0])

m26=len([x for x in a if x%26==0])

m=len(a)

print(m26*(m26-1)//2 + m26*(m-m26) + m2*m13)

 

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

#Вы­би­ра­ем числа по­сле­до­ва­тель­но­сти по оче­ре­ди и при­бав­ля­ем к счет­чи­ку пар число пар, ко­то­рое оче­ред­ное число об­ра­зу­ет с преды­ду­щи­ми:

a = [int(s) for s in open('27989_B.txt')][1:]

cnts = [0]*4

k = 0 # счет­чик ко­ли­че­ства пар

for x in a:

n = (x%2==0)*2 + (x%13==0) # n=0 - не де­лит­ся ни на 2, ни на 13.

# n=2 - де­лит­ся на 2; n=1 - де­лит­ся на 13; n=3 - де­лит­ся на 26;

if n == 3:

k += sum(cnts)

elif n != 0:

k += cnts[3-n] + cnts[3]

else: k += cnts[3]

cnts[n] += 1

print(k)


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

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