Given a set of N elements such that N, task is to generate an array such that the GCD of any subset of the generated array lies in the given set of elements. The generated array should **not be more than thrice the length of the set of the GCD**.

**Prerequisite :** GCD of an Array | Subset of Array

Examples :

Input : 3 1 2 7 Output : 1 1 2 1 7 Input : 4 2 4 6 12 Output : 4 6 12 Input : 5 2 5 6 7 11 Output : No array can be build

**Explanation : **

Calculate the GCD of an array or in this case a set. Now, first sort the given set of GCD. If the GCD of this set is equal to the minimum number of the given set, then just by putting this GCD between each number. But, if this GCD is not the minimum element of the given set, then unfortunately “no array can be build”.

[sourcecode language=”CPP”]

// C++ implementation to generate the

// required array

#include <bits/stdc++.h>

using namespace std;

// Function to return gcd of a and b

int gcd(int a, int b)

{

if (a == 0)

return b;

return gcd(b % a, a);

}

// Function to find gcd of

// array of numbers

int findGCD(vector<int> arr, int n)

{

int result = arr[0];

for (int i = 1; i < n; i++)

result = gcd(arr[i], result);

return result;

}

// Function to generate the array

// with required constraints.

void compute(vector<int> arr, int n)

{

vector<int> answer;

// computing GCD of the given set

int GCD_of_array = findGCD(arr, n);

// Solution exists if GCD of array is equal

// to the minimum element of the array

if(GCD_of_array == arr[0])

{

answer.push_back(arr[0]);

for(int i = 1; i < n; i++)

{

answer.push_back(arr[0]);

answer.push_back(arr[i]);

}

// Printing the built array

for (int i = 0; i < answer.size(); i++)

cout << answer[i] << " ";

}

else

cout << "No array can be build";

}

// Driver function

int main()

{

// Taking in the input and initializing

// the set STL set in cpp has a property

// that it maintains the elements in

// sorted order, thus we do not need

// to sort them externally

int n = 3;

int input[]= {2, 5, 6, 7, 11};

set<int> GCD(input, input + n);

vector<int> arr;

set<int>::iterator it;

for(it = GCD.begin(); it!= GCD.end(); ++it)

arr.push_back(*it);

// Calling the computing function.

compute(arr,n);

return 0;

}

[/sourcecode]

**Output:**

No array can be build

**Time Complexity : **O(nlog(n)), where n is the size of array given.

## Recommended Posts:

- Find whether an array is subset of another array | Added Method 3
- Minimum product subset of an array
- Maximum product subset of an array
- Largest divisible subset in array
- Subset array sum by generating all the subsets
- Find if there is any subset of size K with 0 sum in an array of -1 and +1
- Find the sum of maximum difference possible from all subset of a given array.
- Check whether bitwise AND of a number with any subset of an array is zero or not
- Find the smallest positive integer value that cannot be represented as sum of any subset of a given array
- Find original array from encrypted array (An array of sums of other elements)
- Find an element in array such that sum of left array is equal to sum of right array
- Print modified array after multiple array range increment operations
- Generate original array from an array that store the counts of greater elements on right
- Find minimum value to assign all array elements so that array product becomes greater
- Sort an array where a subarray of a sorted array is in reverse order

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.