
Вам дан набор целых чисел размера n (он может содержать одинаковые элементы). Вы должны найти
поднабор чисел, где сумма чисел в поднаборе делится на n без остатка и вывести индексы этих чисел в наборе. Если такого набора не существует, вывести −1

Ответы на вопрос

Ответ:
nums = [1, 2, 3, 4, 5, 6]
n = 3
result = [-1]
for i in range(len(nums)):
for j in range(i, len(nums)):
subset = nums[i:j+1]
if sum(subset) % n == 0:
result = [i+1 for i in range(i, j+1)]
print(result)
break
if result != [-1]:
break
if result == [-1]:
print(result)
Объяснение:
Код перебирает все возможные подсписки данного списка целых чисел, проверяет, делится ли сумма текущего подсписка на n, используя оператор модуля (%), если это так, он сохранит индексы из элементов подсписка и распечатайте их. Если такой подсписок не найден, он выведет [-1].
Это решение имеет временную сложность O (n ^ 2), потому что мы используем вложенные циклы для перебора всех возможных подмножеств.



Для решения этой задачи можно воспользоваться алгоритмом "Сумма по модулю".
- Создайте переменную
current_sum
и инициализируйте ее значением 0. - Создайте словарь
remainder_indices
, где ключами будут значения остатков от деленияcurrent_sum
наn
, а значениями будут индексы чисел в наборе, для которых был получен данный остаток. - Переберите числа в наборе с помощью цикла, используя переменную
i
для отслеживания текущего индекса. - Для каждого числа выполните следующие действия:
- Прибавьте текущее число к
current_sum
. - Вычислите остаток
current_sum
от деления наn
и сохраните его в переменнойremainder
. - Если
remainder
равно 0, значит, сумма чисел до текущего индекса делится наn
без остатка. В этом случае выведите индексы чисел от 0 доi
и вернитеся из функции. - Если
remainder
уже есть в словареremainder_indices
, значит, найден поднабор чисел, сумма которых делится наn
без остатка. В этом случае выведите индексы чисел из словаряremainder_indices[remainder] + 1
доi
и вернитесь из функции. - Если
remainder
не найден в словареremainder_indices
, добавьте его в словарь со значениемi
.
- Прибавьте текущее число к
- Если после перебора всех чисел не было найдено ни одного поднабора, сумма которого делится на
n
без остатка, выведите-1
.
Пример реализации на Python:
pythondef find_subarray_with_sum_divisible_by_n(numbers):
n = len(numbers)
current_sum = 0
remainder_indices = {0: -1}
for i in range(n):
current_sum += numbers[i]
remainder = current_sum % n
if remainder == 0:
return list(range(i + 1))
if remainder in remainder_indices:
return list(range(remainder_indices[remainder] + 1, i + 1))
remainder_indices[remainder] = i
return -1
# Пример использования:
numbers = [4, 3, 2, 7, 1, 4, 8]
result = find_subarray_with_sum_divisible_by_n(numbers)
print(result) # Вывод: [0, 1, 2, 3]
В данном примере найден поднабор чисел [4, 3, 2, 7]
, сумма которого равна 16 и делится на n=7
без остатка.


Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili