Подсчитайте различные пары индексов в массиве, у которых GCD и LCM совпадают
Опубликовано: 25 Февраля, 2023
Для заданного массива A[] длины N задача состоит в том, чтобы найти общее количество различных пар (i, j) индексов, где 1 ≤ i < j ≤ N , таких, что наибольший общий делитель(gcd) и наименьшее общее кратное( lcm) этих элементов равны.
Примеры:
Input: A[] = {2, 5, 5, 5, 6}
Output: 3
Explanation: Here pair (i, j) are: (2, 3), (3, 4), and (2, 4).
To elaborate, gcd(A2, A3) = lcm(A2, A3) = 5.Input: A[] = {22, 22, 38, 38}
Output: 2
Подход: Задача может быть решена на основе следующего наблюдения:
Наблюдения:
- The observation to be made here is as follows: gcd(Ai, Aj) = lcm(Ai, Aj)⟺ Ai = Aj
- So, the problem reduces to simply counting the number of pairs of equal elements in A.
- Build a frequency map of the elements of A (using map/unordered_map in C++, TreeMap/Hashmap in Java, or dict in python) and then iterate across its elements.
- If an element x has a frequency of fx, then it contributes fx⋅(fx−1)/2 pairs to the answer, so sum this value across all x.
Выполните следующие шаги, чтобы решить проблему:
- Объявите хэш-карту.
- Начните перебирать весь массив
- Если элемент присутствует на карте, то увеличьте значение частоты на 1.
- В противном случае вставьте этот элемент в карту.
- После этого начните обход карты и получите значение (частоту элемента).
- Если элемент x имеет частоту f x , то он вносит f x ⋅ (f x − 1) / 2 пары в ответ, поэтому суммируйте это значение по всем x.
Ниже приведена реализация вышеуказанного подхода:
Временная сложность: O(N)
Вспомогательное пространство: O(1)