Тема (старое) 27. Программирование

03 Цепочки, выбор последовательности, префиксные суммы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела (старое) 27. программирование
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 41#58617Максимум баллов за задание: 2

Дано натуральное число N  , затем дана последовательность N  натуральных чисел. Найдите непрерывную последовательность, внутри которой сумма элементов на нечетных позициях равна сумме элементов на четных позициях. В качестве ответа выведите сумму данной последовательности. Если их несколько, то в качестве ответа укажите наибольшую из сумм.

Входные данные:

Даны два входных файла (файл А и файл В), каждый из которых содержит в первой строке одно целое число N (1 ≤ N ≤ 1000000)  — количество чисел. Каждая из следующих N  строк содержит натуральное число, меньшее    10  000  .

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

Вложения к задаче
Показать ответ и решение
f = open("27B.txt")
n = int(f.readline())
min_ps = [10 ** 100] * 100000000  # Максимальные суммы с различными разностями между sn и sc (префиксы)
sc = sn = mx = 0  # Сумма чисел на чётных позициях / Сумма чисел на нечётных позициях / Макс. сумма
for i in range(n):
    x = int(f.readline())
    sc += x * (i % 2 == 0)  # Прибавляем новое число из файла, если оно на чётной позиции
    sn += x * (i % 2 != 0)  # Прибавляем новое число из файла, если оно на нечётной позиции
    s = sn + sc  # Общая сумма всех чисел
    p = sn - sc  # Разность между суммами на чётных и нечётных позициях
    mx = max(mx, s - min_ps[p])  # Записываем максимальную сумму, вычитая нужный префикс
    min_ps[p] = min(min_ps[p], s)  # После всех проверок записываем текущую сумму как префикс
print(mx)  # Выводим ответ

Ответ: 27716 4569350940

Ошибка.
Попробуйте повторить позже

Задача 42#58618Максимум баллов за задание: 2

Дано натуральное число N  , затем дана последовательность N  натуральных чисел. Найдите непрерывную последовательность с максимальной суммой, в которой количество нечетных элементов кратно 10  . В качестве ответа выведите сумму данной последовательности.

Входные данные:

Даны два входных файла (файл А и файл В), каждый из которых содержит в первой строке одно целое число N (1 ≤ N ≤ 1000000)  — количество чисел. Каждая из следующих N  строк содержит натуральное число, меньшее 10000.

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

Вложения к задаче
Показать ответ и решение
f = open(’27B_2__1natt.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности
s = 0 # сумма всех чисел файла
count = 0 # количество нечётных чисел всего файла
K = 10 # чему должно быть кратно количество нечётных чисел
tails = [10**30]*K # список, в котором под каждым индексом будут записаны минимальные префиксные суммы.
# определенный индекс обозначает остаток при делении на 3.
# Например, tails[2] - это префиксная сумма, у которой количество нечётных чисел даёт остаток 2 при делении на 10
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if x % 2 != 0: # если текущее число - нечётное
        count += 1 # увеличиваем счётчик
    if count % K == 0: # если счётчик кратен 10
        mx = max(mx,s) # перезаписываем максимум
    # если в сумме s количество нечётных чисел не кратно 10
    # тогда убавляем такую префиксную сумму,
    # после которой в полученной подпоследовательности количество нечётных чисел будет кратно 10
    s1 = s - tails[count % K]
    mx = max(mx,s1) # перезаписываем максимум
    # перезаписываем префиксные суммы под определенным остатком при делении на 10
    tails[count % K] = min(tails[count % K], s)
print(mx)

Ответ: 103546 5493881388

Ошибка.
Попробуйте повторить позже

Задача 43#63956Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 37. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

18

10

9

19

14

23

95

В этом наборе можно выбрать последовательности 18+10+9 (сумма 37) и 14+23 (сумма 37). Самая короткая из них, 14 + 23, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’1_B__1vuv9.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 37
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 37 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 37
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 37
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 37
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 37,
    # то убавляем префиксную сумму с остатком при делении на 37 равным остатку при делении на 37 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 37
    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 37 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 775 1751427

Ошибка.
Попробуйте повторить позже

Задача 44#63957Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 74. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

34

27

13

19

23

51

95

В этом наборе можно выбрать последовательности 34+27+13 (сумма 74) и 23+51 (сумма 74). Самая короткая из них, 23+51, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’1_B__1vuv9.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 74
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 74 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 74
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 74
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 74
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 74,
    # то убавляем префиксную сумму с остатком при делении на 74 равным остатку при делении на 74 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 74
    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 74 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 755 1751425

Ошибка.
Попробуйте повторить позже

Задача 45#63958Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 57. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

24

20

13

19

23

34

92

В этом наборе можно выбрать последовательности 24+20+13 (сумма 57) и 23+34 (сумма 57). Самая короткая из них, 23+34, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’3_B__1vuve.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 57
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 57 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 57
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 57
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 57
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 57,
    # то убавляем префиксную сумму с остатком при делении на 57 равным остатку при делении на 57 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 57
    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 57 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 10 59986

Ошибка.
Попробуйте повторить позже

Задача 46#63959Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 67. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла: 7

34

20

13

19

23

44

95

В этом наборе можно выбрать последовательности 34+20+13 (сумма 67) и 23+44 (сумма 67). Самая короткая из них, 23+44, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’4_B__1vuvh.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 67
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 67 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 67
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 67
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 67
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 67,
    # то убавляем префиксную сумму с остатком при делении на 67 равным остатку при делении на 67 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 67

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 67 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 23 99995

Ошибка.
Попробуйте повторить позже

Задача 47#63960Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 317. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

104

127

86

119

166

151

195

В этом наборе можно выбрать последовательности 104+127+86 (сумма 317) и 166+151 (сумма 317). Самая короткая из них имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
with open(’5_B.txt’) as f:
    n = int(f.readline())
    k = [float(’inf’)]*317
    l = [0]*317
    s = 0
    m = 0
    minLen = float(’inf’)
    for i in range(n):
        x = int(f.readline())
        s += x
        if s % 317 == 0:
            if s > m:
                m = s
                minLen = i + 1
        ost = s % 317
        if k[ost] != float(’inf’):
            if (s-k[ost]) > m or (s-k[ost] == m and i - l[ost] + 1 < minLen):
                m = s - k[ost]
                minLen = i-l[ost] + 1
        if k[ost] == float(’inf’):
            k[ost] = s
            l[ost] = i + 1
        if s < k[ost]:
            k[ost] = s
            l[ost] = i + 1
print(minLen)

Ответ: 909 1897356

Ошибка.
Попробуйте повторить позже

Задача 48#63961Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 413. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

123

193

97

119

162

251

195

В этом наборе можно выбрать последовательности 123+193+97 (сумма 413) и 162+251 (сумма 413). Самая короткая из них имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’6_B__1vuvp.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 413
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 413 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 413
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 413
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 413
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 413,
    # то убавляем префиксную сумму с остатком при делении на 413 равным остатку при делении на 413 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 413

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 413 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 750 1751393

Ошибка.
Попробуйте повторить позже

Задача 49#63962Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 111. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

42

37

32

119

66

45

95

В этом наборе можно выбрать последовательности 42+37+32 (сумма 111) и 66+45 (сумма 111). Самая короткая из них имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’7_B__1vuvs.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 111
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 111 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 111
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 111
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 111
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 111,
    # то убавляем префиксную сумму с остатком при делении на 111 равным остатку при делении на 111 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 111

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 111 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 14 99979

Ошибка.
Попробуйте повторить позже

Задача 50#63963Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 185. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

52

57

76

119

97

88

95

В этом наборе можно выбрать последовательности 52+57+76 (сумма 185) и 97+88 (сумма 185). Самая короткая из них имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’8_B__1vuvw.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 185
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 185 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 185
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 185
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 185
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 185,
    # то убавляем префиксную сумму с остатком при делении на 185 равным остатку при делении на 185 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 185

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 185 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 909 1897367

Ошибка.
Попробуйте повторить позже

Задача 51#63964Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 1007. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

652

257

98

419

219

788

595

В этом наборе можно выбрать последовательности 652+257+98 (сумма 1007) и 219+788 (сумма 1007). Самая короткая из них имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’9_B__1vuvy.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 1007
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 1007 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 1007
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 1007
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 1007
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 1007,
    # то убавляем префиксную сумму с остатком при делении на 1007 равным остатку при делении на 1007 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 1007

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 1007 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 839 1897345

Ошибка.
Попробуйте повторить позже

Задача 52#63965Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 1999. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

752

657

590

419

897

1102

495

В этом наборе можно выбрать последовательности 752+657+590 (сумма 1999) и 897+1102 (сумма 1999). Самая короткая из них имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’10_B__1vuw1.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 1999
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 1999 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 1999
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 1999
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 1999
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 1999,
    # то убавляем префиксную сумму с остатком при делении на 1999 равным остатку при делении на 1999 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 1999

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 1999 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 875 1897300

Ошибка.
Попробуйте повторить позже

Задача 53#64077Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 31. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

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

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

7

1

3

4

93

8

5

95

В ответе укажите два числа через пробел: сначала значение искомой длины для файла A, затем – для файла B.

Предупреждение: для обработки файла B не следует использовать переборный алгоритм, вычисляющий сумму для всех возможных вариантов, поскольку написанная по такому алгоритму программа будет выполняться слишком долго.

Вложения к задаче
Показать ответ и решение
with open(’1.txt’) as f:
    n = int(f.readline())
    k = [float(’inf’)]*31
    l = [0]*31
    s = 0
    m = 0
    minLen = float(’inf’)
    for i in range(n):
        x = int(f.readline())
        s += x
        if s % 31 == 0:
            if s > m:
                m = s
                minLen = i + 1
        ost = s % 31
        if k[ost] != float(’inf’):
            if (s-k[ost]) > m or (s-k[ost] == m and i - l[ost] + 1 < minLen):
                m = s - k[ost]
                minLen = i-l[ost] + 1
        if k[ost] == float(’inf’):
            k[ost] = s
            l[ost] = i + 1
        if s < k[ost]:
            k[ost] = s
            l[ost] = i + 1
print(minLen)

Ответ: 995 999984

Ошибка.
Попробуйте повторить позже

Задача 54#81711Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 102. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

120

84

33

157

46

1

95

В этом наборе можно выбрать последовательности 120+84 (сумма 204) и 157+46+1 (сумма 204). Самая короткая из них, 120+84, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’1B__3f33y.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 102
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 102 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 102
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 102
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 102
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 102,
    # то убавляем префиксную сумму с остатком при делении на 102 равным остатку при делении на 102 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 102

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 102 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 194 59978

Ошибка.
Попробуйте повторить позже

Задача 55#81712Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 66. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

66

60

72

10

100

98

95

В этом наборе можно выбрать последовательности 66+60+72 (сумма 198) и 100+98 (сумма 198). Самая короткая из них, 100+98, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’2B__3f34m.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 66
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 66 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 66
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 66
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 66
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 66,
    # то убавляем префиксную сумму с остатком при делении на 66 равным остатку при делении на 66 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 66

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 66 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 228 49995

Ошибка.
Попробуйте повторить позже

Задача 56#81713Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 80. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

34

27

19

11

29

51

95

В этом наборе можно выбрать последовательности 34+27+19 (сумма 80) и 29+51 (сумма 80). Самая короткая из них, 29+51, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’3B__3f35a.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 80
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 80 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 80
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 80
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 80
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 80,
    # то убавляем префиксную сумму с остатком при делении на 80 равным остатку при делении на 80 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 80

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 80 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 188 69982

Ошибка.
Попробуйте повторить позже

Задача 57#81714Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 138. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

34

27

58

11

101

37

95

В этом наборе можно выбрать последовательности 34+27+58 (сумма 138) и 101+37 (сумма 138). Самая короткая из них, 101+37, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’4B__3f35r.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 138
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 138 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 138
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 138
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 138
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 138,
    # то убавляем префиксную сумму с остатком при делении на 138 равным остатку при делении на 138 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 138

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 138 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 494 98984

Ошибка.
Попробуйте повторить позже

Задача 58#81715Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие что сумма элементов каждой из них кратна k = 97. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

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

пример входного файла:

7

44

11

42

11

34

63

95

В этом наборе можно выбрать последовательности 44+11+42 (сумма 97) и 34+63 (сумма 97). Самая короткая из них, 34+63, имеет длину 2. Ответ: 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’5B__3f36d.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 97
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 97 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 97
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 97
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 97
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 97,
    # то убавляем префиксную сумму с остатком при делении на 97 равным остатку при делении на 97 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 97

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 97 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 348 47985

Ошибка.
Попробуйте повторить позже

Задача 59#82942Максимум баллов за задание: 2

Дана последовательность из N натуральных чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них кратна k = 375. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой длинной из них.

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

Пример входного файла:

7

58

495

217

674

609

193

375

В этом наборе можно выбрать числа 217, 674 и 609, которые в сумме образуют число 1500, кратное 375. А также последнее число 375. Ответом для данного примера будет число 3.

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

Вложения к задаче
Показать ответ и решение
f = open(’27B_04_1__3kndh.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 375
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 375 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 375
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 375
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0: # если сумма кратна 375
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 375,
    # то убавляем префиксную сумму с остатком при делении на 375 равным остатку при делении на 375 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 375

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина больше
    if s1 > mx or (s1 == mx and ln1 > ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 375 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 967 999952

Ошибка.
Попробуйте повторить позже

Задача 60#82943Максимум баллов за задание: 2

Дана последовательность из N целых чисел. Рассматриваются все её непрерывные подпоследовательности, такие, что сумма элементов каждой из них кратна k = 27. Найдите среди них подпоследовательность с максимальной суммой, определите её длину. Если таких подпоследовательностей найдено несколько, в ответе укажите количество элементов самой короткой из них.

Входные данные: Даны два входных файла: файл A и файл B, каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 107)  . Каждая из следующих N строк содержит целое число, по модулю не превышающее   4
10  .

Пример входного файла:

7

35

10

-18

-22

-22

49

-43

В этом наборе можно выбрать числа 35, 10 и -18, которые в сумме образуют число 27. А также числа -22 и 49, тоже в сумме образующие число 27. Ответом для данного примера будет число 2.

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

Вложения к задаче
Показать ответ и решение
f = open(’27B_04_2__3knet.txt’)
n = int(f.readline())
mx = 0 # максимальная сумма подпоследовательности кратной 27
s = 0 # сумма всех чисел файла
ln = 0 # длина подпоследовательности
D = 27 # наш делитель
tails = [10**30]*D # префиксные суммы под определенным остатком при делении на 27
len_tails = [0]*D # длина префиксной суммы под определенным остатком при делении на 27
for i in range(n):
    x = int(f.readline()) # считываем текущее число
    s += x
    if s % D == 0 and s > mx: # если сумма кратна 27 и больше максимума
        mx = s # перезаписываем максимальную сумму
        ln = i + 1 # перезаписываем длину последовательности
    s1 = s - tails[s % D] # если сумма s не кратна 27,
    # то убавляем префиксную сумму с остатком при делении на 27 равным остатку при делении на 27 у суммы s
    # тогда мы получим новую сумму s1, которая кратна 27

    ln1 = (i+1) - len_tails[s % D] # вычисляем длину последовательности суммы s1
    # если сумма s1 больше максимума или сумма s1 равна максимуму и при этом её длина меньше
    if s1 > mx or (s1 == mx and ln1 < ln):
        mx = s1 # перезаписываем максимум
        ln = ln1 # перезаписываем длину
    # если сумма s меньше той, что записана в списке tails с таким же остатком при делении на 27 как и у s
    if s < tails[s % D]:
        tails[s % D] = s # перезаписываем сумму
        len_tails[s % D] = i + 1 # указываем длину данной последовательности
print(ln)

Ответ: 734 86922
Рулетка
Вы можете получить скидку в рулетке!