Перечислите точки сетки на 2D плоскости в порядке убывания (x * y)

ДаноN > 0 а такжеM > 0Я хочу перечислить все (x, y) пары, чтобы 1 & lt; = x & lt; = N и 1 & lt; = y & lt; = M в порядке убывания (x * y). Пример: учитывая N = 3 и M = 2, последовательность перечисления должна быть:

1. (3, 2) -- 3 * 2 = 6
2. (2, 2) -- 2 * 2 = 4
3. (3, 1) -- 3 * 1 = 3
4. (2, 1) -- 2 * 1 = 2
5. (1, 2) -- 1 * 2 = 2
6. (1, 1) -- 1 * 1 = 1

Получатель чего-то(2, 1) а также(1, 2) можно поменять местами. Одним из очевидных способов является перечисление их всех, вставка вvector<pair<int, int> >и позвонитеstd::sort() с моей собственной функцией сравнения. Однако, поскольку N и M могут быть большими, и в большинстве случаев мне нужны только первые несколько членов последовательности, я надеюсь, что мог бы быть какой-то более умный способ генерирования такой последовательности вместо генерации их всех и сортировки, требует столько, сколькоN*M элементы массива.

Update: Я забыл упомянуть, что, хотя в большинстве случаев мне нужны только первые несколько терминов, количество требуемых терминов неизвестно до перечисления.

Ответы на вопрос(8)

Ваш ответ на вопрос