Given an array arr[] consisting of N elements, the task is to minimize the array length by replacing any two coprime array elements with 1.
Examples:
_Input: _arr[] = {2, 3, 5}
Output:_ 1_
Explanation:
Replace {2, 3} with 1 modifies the array to {1, 5}.
Replace {1, 5} with 1 modifies the array to {1}.
_Input: _arr[] = {6, 9, 15}
_Output: _3
Explanation:_ No coprime pairs exist in the array. Therefore, no reduction possible._
Naive Approach: The simplest approach is to iterate over the array and check for coprime pairs. If found replace it with 1 search for the next coprime pair and so on.
Time Complexity:_ O(N3 * log__N)_
Auxiliary Space:_ O(1)_
**Efficient Approach: **This approach is based on the fact:
1 is coprime with every number
The idea is to find if there is any co-prime pair present in the array or not. If found, then all the array elements can be reduced to 1 based on the above fact. Hence, if any co-prime pair is found, then, the required answer will be 1, else, the answer will be the initial size of the array.
Illustration:
For arr[] = {2, 4, 6, 8, 9}
Here, as there exists a coprime pair {2, 9}, replacing them by 1 modifies the array to {1, 4, 6, 8}.
Since 1 is coprime with every number, the array can be reduced further in following steps:
{1, 4, 6, 8} -> {1, 6, 8} -> {1, 8} -> {1}
Hence, the array can be reduced to size 1.
Below is the implementation of the above approach:
// C++ Program for the above approach
#include <bits/stdc++.h>
**using**
**namespace**
std;
// Function to find the final array
// length by replacing coprime pair with 1
**bool**
hasCoprimePair(vector<``**int**``>& arr,
**int**
n)
{
// Iterate over all pairs of element
**for**
(``**int**
i = 0; i < n - 1; i++) {
**for**
(``**int**
j = i + 1; j < n; j++) {
// Check if gcd is 1
**if**
(__gcd(arr[i], arr[j]) == 1) {
**return**
**true**``;
}
}
}
// If no coprime pair
// found return false
**return**
**false**``;
}
// Driver code
**int**
main()
{
**int**
n = 3;
vector<``**int**``> arr = { 6, 9, 15 };
// Check if atleast one coprime
// pair exists in the array
**if**
(hasCoprimePair(arr, n)) {
cout << 1 << endl;
}
// If no such pair exists
**else**
{
cout << n << endl;
}
}
Output:
3
_Time Complexity: _O(N2 * log N)
Auxiliary Space:_ O(1)_
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
#arrays #greedy #mathematical #searching #prime number