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

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

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

Файл A

Файл B

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

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

 

Ответ:

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

Ре­ше­ние.

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

f = open("27-A (1).txt")

n = int(f.readline())

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

count = 0

sumi = 0

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

num = int(f.readline())

sumi += num

if sumi % 999 == 0:

count = count + 1

count += lefts[sumi % 999]

lefts[sumi % 999] += 1

print(count)

 

Ответ: 403  1801801220.

 

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

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

 

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

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

cnt = [1]+[0]*998

p = 0

for x in a:

p = (p+x)%999

cnt[p] += 1

print(sum([cnt[i]*(cnt[i]-1)//2 for i in range(999)]))

 

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

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

 

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

var

i, n, num, count: integer;

sum: int64;

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

f: text;

begin

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

reset(f);

readln(f, n);

for i := 0 to 998 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 999 = 0) then count := count + 1;

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

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

end;

writeln(count);

end.

 

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

 

При­ведём ре­ше­ние Сер­гея Донец на языке PascalABC.NET.

begin

var a := ReadAllLines('27.txt').Skip(1).Select(x -> x.ToInteger).ToArray;

var cnt := ArrGen(999, i -> Ord(i = 0));

var p := 0;

foreach var x in a do

begin

p := (p + x) mod 999;

cnt[p] += 1;

end;

var res := cnt.Select(c -> c * (c - 1) div 2).Sum;

Print(res);

end.


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