Как найти такие 2 числа в последовательности, сумма которых будет кратна m? Вводится последовательность из чисел огромной длины (размер может достигать maxInt), нужно вывести максимально быстро (ограничение 1 секунда) такие 2 числа, сумма которых будет кратна какому-либо вводимому m (если таких несколько, то вывести каждую пару). Сами числа так же могут достигать maxInt. Сложность заключается лишь в том, что последовательность очень длинная. С короткими вариантами код вполне легкий (обычный перебор). Жду предложения алгоритмов / решения. Заранее спасибо! Upd: m != 1
Один из возможных вариантов решения данной задачи - использование хэш-таблицы для хранения остатков от деления чисел в последовательности на m.
Создать хэш-таблицу ассоциативныймассивассоциативный массивассоциативныймассив, где ключами будут остатки от деления чисел на m, а значениями - список пар чисел, которые дали такой остаток.Проходить по каждому числу в последовательности и добавлять его в соответствующий список в хэш-таблице.Для каждого числа в последовательности находить пару, сумма которых даст остаток, равный m.Печатать найденные пары.
Пример кода на Python:
from collections import defaultdict def find_pairssequence,msequence, msequence,m: hash_table = defaultdictlistlistlist
pairs = for num in sequence: remainder = num % m hash_tableremainderremainderremainder.appendnumnumnum for key in hash_table.keys: if key == 0 or key == m // 2: pairs.extend[(num1,num2)fornum1inhashtable[key]fornum2inhashtable[key]ifnum1!=num2][(num1, num2) for num1 in hash_table[key] for num2 in hash_table[key] if num1 != num2][(num1,num2)fornum1inhashtable[key]fornum2inhashtable[key]ifnum1!=num2]
elif key < m / 2 and m - key in hash_table: pairs.extend[(num1,num2)fornum1inhashtable[key]fornum2inhashtable[m−key]][(num1, num2) for num1 in hash_table[key] for num2 in hash_table[m - key]][(num1,num2)fornum1inhashtable[key]fornum2inhashtable[m−key]] return pairs # Ввод последовательности и m sequence = listmap(int,input().split())map(int, input().split())map(int,input().split())
m = intinput()input()input() pairs = find_pairssequence,msequence, msequence,m
for pair in pairs: printpair[0],pair[1]pair[0], pair[1]pair[0],pair[1]
Этот алгоритм имеет сложность Onnn, где n - количество чисел в последовательности. Мы проходим по каждому числу один раз, добавляя его в хэш-таблицу, и затем ищем пары чисел для каждого элемента в хэш-таблице.
Один из возможных вариантов решения данной задачи - использование хэш-таблицы для хранения остатков от деления чисел в последовательности на m.
Создать хэш-таблицу ассоциативныймассивассоциативный массивассоциативныймассив, где ключами будут остатки от деления чисел на m, а значениями - список пар чисел, которые дали такой остаток.Проходить по каждому числу в последовательности и добавлять его в соответствующий список в хэш-таблице.Для каждого числа в последовательности находить пару, сумма которых даст остаток, равный m.Печатать найденные пары.Пример кода на Python:
from collections import defaultdictdef find_pairssequence,msequence, msequence,m:
hash_table = defaultdictlistlistlist pairs =
for num in sequence:
remainder = num % m
hash_tableremainderremainderremainder.appendnumnumnum
for key in hash_table.keys:
if key == 0 or key == m // 2:
pairs.extend[(num1,num2)fornum1inhashtable[key]fornum2inhashtable[key]ifnum1!=num2][(num1, num2) for num1 in hash_table[key] for num2 in hash_table[key] if num1 != num2][(num1,num2)fornum1inhasht able[key]fornum2inhasht able[key]ifnum1!=num2] elif key < m / 2 and m - key in hash_table:
pairs.extend[(num1,num2)fornum1inhashtable[key]fornum2inhashtable[m−key]][(num1, num2) for num1 in hash_table[key] for num2 in hash_table[m - key]][(num1,num2)fornum1inhasht able[key]fornum2inhasht able[m−key]]
return pairs
# Ввод последовательности и m
sequence = listmap(int,input().split())map(int, input().split())map(int,input().split()) m = intinput()input()input()
pairs = find_pairssequence,msequence, msequence,m for pair in pairs:
printpair[0],pair[1]pair[0], pair[1]pair[0],pair[1]
Этот алгоритм имеет сложность Onnn, где n - количество чисел в последовательности. Мы проходим по каждому числу один раз, добавляя его в хэш-таблицу, и затем ищем пары чисел для каждого элемента в хэш-таблице.