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

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

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

Файл A

Файл B

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

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

5

2

6

13

31

93

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

4

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

 

Ответ:

 

По­яс­не­ние. Из 5 чисел можно со­ста­вить 4 пары, удо­вле­тво­ря­ю­щие усло­вию. Для за­дан­но­го на­бо­ра чисел по­лу­ча­ем пары (2, 31), (2, 93), (6, 31), (6, 93).

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

Ре­ше­ние.

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

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

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

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

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

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

2)  n31  — ко­ли­че­ство чисел, крат­ных 31, но не крат­ных 62;

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

Ко­ли­че­ство пар, удо­вле­тво­ря­ю­щих усло­вию А, можно вы­чис­лить по фор­му­ле n62 · (n62 – 1) : 2.

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

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

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

 

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

var

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

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

n62, n31, n2: integer;

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

i: integer;

f: text;

begin

n62:=0; n31:=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 62 = 0 then

n62 := n62+1

else if a mod 31 = 0 then

n31:= n31 + 1

else if a mod 2 = 0 then

n2 := n2 + 1;

end;

k62 := n62*(n62-1) div 2 + n62*(N-n62) + n2*n31;

writeln(k62)

end.

 

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

 

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

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

 

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

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

s = f.readlines()

n = int(s[0])

k = 0

k_0 = 0

k_62 = 0

k_2 = 0

k_31 = 0

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

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

if s[i] % 62 == 0:

k_62 += 1

elif s[i] % 31 == 0:

k_31 += 1

elif s[i] % 2 == 0:

k_2 += 1

else:

k_0 += 1

k = k_62 * k_0 + k_31 * k_2 + k_62 * k_31 + k_62 * k_2 + (k_62 * (k_62 - 1)) // 2

print(k)


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

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