Как получить всевозможные подходящие варианты остатков
Задача – выбрать несколько заданных чисел (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)