Как получить всевозможные подходящие варианты остатков

Рейтинг: 0Ответов: 0Опубликовано: 08.01.2023

Задача – выбрать несколько заданных чисел (1 ≤ несколько ≤ N) таким образом, чтобы сумма выбранных чисел была кратна N. есть двумерный список в котором записаны остатки от деления на конкретное число n, например:

n = 5

а массив исходных чисел

a = [1,2,3,4,1]

мой список остатков будет выглядеть так:

d = [ [], [1, 1], [2], [3], [4] ]

индекс первого элемента равен остатку от деления на пять, т.е( от 0 до 4) а внутри списка уже сами числа, пришлось использовать двумерный список, чтоб избавиться от перезаписи чисел с одинаковыми остатками

нужно вывести несколько чисел которые будут кратны нашему n. для этого я использую остатки, ведь если сумма остатков кратна n, то и сумма чисел будет кратна n. вопрос в том как эффективно перебрать все эти числа (лимит в контесте 1 секунда и 64мб памяти). нужно перебрать все числа с остатками которые в сумме дают наше число n и вывести эту комбинацию в ответ(если комбинаций несколько вывести можно любую) пытался использовать combinations, но скорее всего получу timelimit, т.к ограничение на n: (1 ≤ n ≤ 10000) прикладываю свой код

n = int(input())
a = []
for x in range(n):
    a.append(int(input()))

d = [[] for x in range(n)]

for x in range(len(a)):
    d[a[x]%n].append(a[x])

print(d)

так я пытался перебрать все числа из этого списка, сумма остатков которых дает n

b = [x for x in range(1,n+1)]

c = [list(i) for x in range(1,n) for i in combinations(b,x) if len(i) > 1 and sum(i) == n]

for x in range(len(d)):
    for i in range(x,len(d)):
        for j in c:
            if (x == j[0] and i == j[1]) or (x == j[1] and i == j[0]):
                if len(d[x]) > 0 and len(d[i]) > 0:
                    print(len(j))
                    print(d[x][0],d[i][0],sep = "\n")

a = [1,2,3,4,1] Ответом на задачу с примером массива a:

2  # кол-во чисел
2  # число 1
3  # число 2

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

Ответы

Ответов пока нет.