Не существует супер-эффективных способов сделать это. Лучшее, о чем я могу думать, это O (n ^ 2):
Имеет вспомогательную функцию, которая принимает число (a) и список и проходит через каждый элемент (b), проверяя a * b = z и сохраняя пару, если она есть.
Просмотрите каждый элемент вашего исходного списка, и если определенный элемент (x) делит z (то есть z% x = 0), тогда отправьте x и остаток списка после x вспомогательной функции.
UPDATE:
Я даю решение O (n ^ 2), потому что в вопросе не указаны уникальные пары. Если нужны только уникальные пары, это следует добавить к вопросу. Кроме того, мое решение предполагает, что порядок пар не имеет значения, что является еще одной деталью, которую следует уточнить.