Wylicz punkty siatki na płaszczyźnie 2D w porządku malejącym (x * y)

DanyN > 0 iM > 0, Chcę wyliczyć wszystkie pary (x, y) takie, że 1 <= x <= N i 1 <= y <= M w porządku malejącym (x * y). Przykład: podane N = 3 i M = 2, sekwencja wyliczeniowa powinna być:

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

Kolejność(2, 1) i(1, 2) może zostać zamieniony. Jednym z oczywistych sposobów jest wymienienie ich wszystkich, wstawienie dovector<pair<int, int> >i zadzwoństd::sort() z własną funkcją porównania. Jednakże, ponieważ N i M mogą być duże, a przez większość czasu potrzebuję tylko pierwszych kilku terminów sekwencji, mam nadzieję, że może istnieć jakiś mądrzejszy sposób, który generuje taką sekwencję zamiast generować je wszystkie i sortować, co wymaga aż tyleN*M elementy tablicy.

Aktualizacja: Zapomniałem wspomnieć, że chociaż przez większość czasu potrzebuję tylko kilku pierwszych terminów, liczba wymaganych terminów jest nieznana przed wyliczeniem.

questionAnswers(8)

yourAnswerToTheQuestion