Algorytm zmniejszania ułamków całkowitych

(Wynika to z niedawno zakończonego konkursu programistycznego)

Otrzymujesz dwie tablice 10 ^ 5 intów w zakresie 1..10 ^ 7 włącznie:

int N[100000] = { ... }
int D[100000] = { ... }

Wyobraź sobie, że wymierna liczba X jest wynikiem mnożenia wszystkich elementów N i podzielenia przez wszystkie elementy D.

Zmodyfikuj dwie tablice bez zmiany wartości X (bez przypisywania żadnego elementu poza zakresem), tak aby iloczyn N i iloczynu D nie miały wspólnego czynnika.

Naiwnym rozwiązaniem (jak sądzę) byłoby działanie ...

for (int i = 0; i < 100000; i++)
    for (int j = 0; j < 100000; j++)
    {
        int k = gcd(N[i], D[j]); // euclids algorithm

        N[i] /= k;
        D[j] /= k;
    }

... ale to jest za wolne.

Co to jest rozwiązanie, które zajmuje mniej niż około 10 ^ 9 operacji?

questionAnswers(4)

yourAnswerToTheQuestion