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

Дана по­сле­до­ва­тель­ность на­ту­раль­ных чисел. Не­об­хо­ди­мо опре­де­лить ко­ли­че­ство её не­пре­рыв­ных под­по­сле­до­ва­тель­но­стей, сумма эле­мен­тов ко­то­рых крат­на 1111.

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

Файл A

Файл B

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство чисел в на­бо­ре. Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно число. Га­ран­ти­ру­ет­ся, что общая сумма всех чисел и число в от­ве­те не пре­вы­ша­ют 2 · 109 по аб­со­лют­ной ве­ли­чи­не.

Вам даны два вход­ных файла (A и B), каж­дый из ко­то­рых имеет опи­сан­ную выше струк­ту­ру. В от­ве­те ука­жи­те два числа: сна­ча­ла зна­че­ние ис­ко­мой суммы для файла A, затем для файла B.

 

Ответ:

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

Ре­ше­ние.

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

f = open("27-B.txt")

n = int(f.readline())

lefts = [0 for i in range(1111)]

count = 0

sumi = 0

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

num = int(f.readline())

sumi += num

if sumi % 1111 == 0:

count = count + 1

count += lefts[sumi % 1111]

lefts[sumi % 1111] += 1

print(count)

 

Ответ: 344  1620157920.

 

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

nums = [int(s) for s in open('27-B.txt') ][1:]

rems = [1]+[0]*1110

s=0

for x in nums:

s+=x

rems[s%1111] += 1

print(sum([x*(x-1)//2 for x in rems]))

 

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

Если будет най­де­на под­по­сле­до­ва­тель­ность чисел с остат­ком от де­ле­ния суммы эле­мен­тов этой под­по­сле­до­ва­тель­но­сти на 1111 рав­ным 1, чтобы сумма эле­мен­тов най­ден­ной под­по­сле­до­ва­тель­но­сти была крат­на 1111, до­ста­точ­но вы­честь из неё сумму эле­мен­тов дру­гой под­по­сле­до­ва­тель­но­сти с остат­ком 1. Объ­явим мас­сив lefts, в ко­то­ром будем хра­нить ко­ли­че­ство най­ден­ных под­по­сле­до­ва­тель­но­стей с остат­ком от де­ле­ния суммы эле­мен­тов этой под­по­сле­до­ва­тель­но­сти на 1111 от 0 до 1110. Каж­дый раз, на­хо­дя под­по­сле­до­ва­тель­ность с тем или иным остат­ком от де­ле­ния суммы эле­мен­тов этой под­по­сле­до­ва­тель­но­сти на 1111, будем при­бав­лять к пе­ре­мен­ной count хра­ня­ще­е­ся в мас­си­ве lefts зна­че­ние с со­от­вет­ству­ю­щим остат­ком от де­ле­ния суммы эле­мен­тов этой под­по­сле­до­ва­тель­но­сти.

 

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

var

i, n, num, count: integer;

sum: int64;

lefts: array[0..1110] of int64;

f: text;

begin

assign(f,'C:\27-B.txt');

reset(f);

readln(f, n);

for i := 0 to 1110 do begin

lefts[i] := 0;

end;

count := 0;

sum := 0;

for i := 1 to n do begin

readln(f, num);

sum := sum + num;

if (sum mod 1111 = 0) then count := count + 1;

count := count + lefts[sum mod 1111];

lefts[sum mod 1111] := lefts[sum mod 1111] + 1;

end;

writeln(count);

end.

 

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

 

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

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


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