# Minimum length of subsequence having unit GCD

Given an array arr[] of N positive integers. The task is to find the length of the shortest sub-sequence such that the GCD of the subsequence is 1. If none of the sub-sequence has GCD 1, then print “-1“.

Examples:

Input: arr[] = {2, 6, 12, 3}
Output: 2
Explanation:
The GCD of 2, 3 = 1, which is the smallest length of subsequence like 2.

Input: arr[] = {2, 4}
Output: -1
Explanation:
GCD of 2, 4 = 2

Naive Approach: The idea is to generate all possible subsequences of the given array and print the length of that subsequence whose GCD is unity and has a minimum length. If none of the sub-sequences has GCD 1, then print “-1“.

Time Complexity: O(2N
Auxiliary Space: O(1)

Another Approach: Using the Dynamic programming Tabulation method

We use a 2D matrix to store the previous computation of sub-problems and find the actual answer.

Implementation steps :

• Create a table to store the solution of the subproblems.
• Initialize the table with base cases
• Fill up the table iteratively
• Return the final solution

Implementation:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `int` `findMinimumLength(vector<``int``>& a)``{``    ``int` `n = a.size();``    ``vector > dp(n, vector<``int``>(n, 0));` `    ``// Calculate the GCD of all elements in the sequence``    ``int` `gcd = a[0];``    ``for` `(``int` `i = 1; i < n; i++) {``        ``gcd = __gcd(gcd, a[i]);``    ``}` `    ``// If the GCD is not 1, it's impossible to form a``    ``// subsequence with GCD 1``    ``if` `(gcd != 1) {``        ``return` `-1;``    ``}` `    ``// Initialize the diagonal of the dp table to 1``    ``for` `(``int` `i = 0; i < n; i++) {``        ``dp[i][i] = 1;``    ``}` `    ``// Calculate the dp table``    ``for` `(``int` `len = 2; len <= n; len++) {``        ``for` `(``int` `i = 0; i < n - len + 1; i++) {``            ``int` `j = i + len - 1;``            ``int` `g = __gcd(a[i], a[j]);``            ``if` `(g == 1) {``                ``dp[i][j] = 2;``            ``}``            ``else` `{``                ``dp[i][j] = INT_MAX;``                ``for` `(``int` `k = i; k < j; k++) {``                    ``dp[i][j] = min(dp[i][j],``                                   ``dp[i][k] + dp[k + 1][j]);``                ``}``            ``}``        ``}``    ``}` `    ``return` `dp[0][n - 1];``}` `// Driver Code``int` `main()``{``    ``vector<``int``> a = { 2, 6, 12, 3 };``    ``// function call``    ``int` `ans = findMinimumLength(a);``    ``if` `(ans == -1) {``        ``cout << -1 << endl;``    ``}``    ``else` `{``        ``cout << ans << endl;``    ``}``    ``return` `0;``}` `// this code is contributed by bhardwajji`

## Java

 `import` `java.util.*;` `public` `class` `Main {` `  ``public` `static` `int``    ``findMinimumLength(ArrayList a)``  ``{``    ``int` `n = a.size();``    ``int``[][] dp = ``new` `int``[n][n];` `    ``// Calculate the GCD of all elements in the sequence``    ``int` `gcd = a.get(``0``);``    ``for` `(``int` `i = ``1``; i < n; i++) {``      ``gcd = gcd(gcd, a.get(i));``    ``}` `    ``// If the GCD is not 1, it's impossible to form a``    ``// subsequence with GCD 1``    ``if` `(gcd != ``1``) {``      ``return` `-``1``;``    ``}` `    ``// Initialize the diagonal of the dp table to 1``    ``for` `(``int` `i = ``0``; i < n; i++) {``      ``dp[i][i] = ``1``;``    ``}` `    ``// Calculate the dp table``    ``for` `(``int` `len = ``2``; len <= n; len++) {``      ``for` `(``int` `i = ``0``; i < n - len + ``1``; i++) {``        ``int` `j = i + len - ``1``;``        ``int` `g = gcd(a.get(i), a.get(j));``        ``if` `(g == ``1``) {``          ``dp[i][j] = ``2``;``        ``}``        ``else` `{``          ``dp[i][j] = Integer.MAX_VALUE;``          ``for` `(``int` `k = i; k < j; k++) {``            ``dp[i][j] = Math.min(``              ``dp[i][j],``              ``dp[i][k] + dp[k + ``1``][j]);``          ``}``        ``}``      ``}``    ``}` `    ``return` `dp[``0``][n - ``1``];``  ``}` `  ``public` `static` `int` `gcd(``int` `a, ``int` `b)``  ``{``    ``if` `(b == ``0``) {``      ``return` `a;``    ``}``    ``else` `{``      ``return` `gcd(b, a % b);``    ``}``  ``}` `  ``public` `static` `void` `main(String[] args)``  ``{``    ``ArrayList a``      ``= ``new` `ArrayList<>(Arrays.asList(``2``, ``6``, ``12``, ``3``));``    ` `    ``// function call``    ``int` `ans = findMinimumLength(a);``    ``if` `(ans == -``1``) {``      ``System.out.println(-``1``);``    ``}``    ``else` `{``      ``System.out.println(ans);``    ``}``  ``}``}` `// This code is contributed by user_dtewbxkn77n`

## Python3

 `# Python program for the above approach` `import` `math`  `def` `findMinimumLength(a):``    ``n ``=` `len``(a)``    ``dp ``=` `[[``0``] ``*` `n ``for` `_ ``in` `range``(n)]` `    ``# Calculate the GCD of all elements in the sequence``    ``gcd ``=` `a[``0``]``    ``for` `i ``in` `range``(``1``, n):``        ``gcd ``=` `math.gcd(gcd, a[i])` `    ``# If the GCD is not 1, it's impossible to form a subsequence with GCD 1``    ``if` `gcd !``=` `1``:``        ``return` `-``1` `    ``# Initialize the diagonal of the dp table to 1``    ``for` `i ``in` `range``(n):``        ``dp[i][i] ``=` `1` `    ``# Calculate the dp table``    ``for` `length ``in` `range``(``2``, n``+``1``):``        ``for` `i ``in` `range``(n ``-` `length ``+` `1``):``            ``j ``=` `i ``+` `length ``-` `1``            ``g ``=` `math.gcd(a[i], a[j])``            ``if` `g ``=``=` `1``:``                ``dp[i][j] ``=` `2``            ``else``:``                ``dp[i][j] ``=` `float``(``'inf'``)``                ``for` `k ``in` `range``(i, j):``                    ``dp[i][j] ``=` `min``(dp[i][j], dp[i][k] ``+` `dp[k``+``1``][j])` `    ``return` `dp[``0``][n``-``1``]`  `# Driver Code``a ``=` `[``2``, ``6``, ``12``, ``3``]``ans ``=` `findMinimumLength(a)``if` `ans ``=``=` `-``1``:``    ``print``(``-``1``)``else``:``    ``print``(ans)` `# Contributed by adityasha4x71`

## Javascript

 `function` `findMinimumLength(a) {``    ``const n = a.length;``    ``const dp = Array.from({``        ``length: n``    ``}, () => ``new` `Array(n).fill(0));` `    ``// Calculate the GCD of all elements in the sequence``    ``let gcd = a[0];``    ``for` `(let i = 1; i < n; i++) {``        ``gcd = gcdFunc(gcd, a[i]);``    ``}` `    ``// If the GCD is not 1, it's impossible to form a subsequence with GCD 1``    ``if` `(gcd !== 1) {``        ``return` `-1;``    ``}` `    ``// Initialize the diagonal of the dp table to 1``    ``for` `(let i = 0; i < n; i++) {``        ``dp[i][i] = 1;``    ``}` `    ``// Calculate the dp table``    ``for` `(let len = 2; len <= n; len++) {``        ``for` `(let i = 0; i < n - len + 1; i++) {``            ``const j = i + len - 1;``            ``const g = gcdFunc(a[i], a[j]);``            ``if` `(g === 1) {``                ``dp[i][j] = 2;``            ``} ``else` `{``                ``dp[i][j] = Infinity;``                ``for` `(let k = i; k < j; k++) {``                    ``dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k + 1][j]);``                ``}``            ``}``        ``}``    ``}` `    ``return` `dp[0][n - 1];``}` `function` `gcdFunc(a, b) {``    ``if` `(b === 0) {``        ``return` `a;``    ``} ``else` `{``        ``return` `gcdFunc(b, a % b);``    ``}``}` `const a = [2, 6, 12, 3];``const ans = findMinimumLength(a);``if` `(ans === -1) {``    ``console.log(-1);``} ``else` `{``    ``console.log(ans);``}`

## C#

 `using` `System;``using` `System.Collections.Generic;``using` `System.Linq;` `class` `Program {``    ``static` `int` `FindMinimumLength(List<``int``> a)``    ``{``        ``int` `n = a.Count;``        ``int``[, ] dp = ``new` `int``[n, n];` `        ``// Calculate the GCD of all elements in the sequence``        ``int` `gcd = a[0];``        ``for` `(``int` `i = 1; i < n; i++) {``            ``gcd = Gcd(gcd, a[i]);``        ``}` `        ``// If the GCD is not 1, it's impossible to form a``        ``// subsequence with GCD 1``        ``if` `(gcd != 1) {``            ``return` `-1;``        ``}` `        ``// Initialize the diagonal of the dp table to 1``        ``for` `(``int` `i = 0; i < n; i++) {``            ``dp[i, i] = 1;``        ``}` `        ``// Calculate the dp table``        ``for` `(``int` `len = 2; len <= n; len++) {``            ``for` `(``int` `i = 0; i < n - len + 1; i++) {``                ``int` `j = i + len - 1;``                ``int` `g = Gcd(a[i], a[j]);``                ``if` `(g == 1) {``                    ``dp[i, j] = 2;``                ``}``                ``else` `{``                    ``dp[i, j] = ``int``.MaxValue;``                    ``for` `(``int` `k = i; k < j; k++) {``                        ``dp[i, j] = Math.Min(``                            ``dp[i, j],``                            ``dp[i, k] + dp[k + 1, j]);``                    ``}``                ``}``            ``}``        ``}` `        ``return` `dp[0, n - 1];``    ``}` `    ``static` `int` `Gcd(``int` `a, ``int` `b)``    ``{``        ``if` `(a == 0) {``            ``return` `b;``        ``}``        ``return` `Gcd(b % a, a);``    ``}` `    ``static` `void` `Main(``string``[] args)``    ``{``        ``List<``int``> a = ``new` `List<``int``>() { 2, 6, 12, 3 };``        ``// function call``        ``int` `ans = FindMinimumLength(a);``        ``if` `(ans == -1) {``            ``Console.WriteLine(-1);``        ``}``        ``else` `{``            ``Console.WriteLine(ans);``        ``}``    ``}``}`

Output
`2`

Time Complexity: O(n^3)
Auxiliary Space: O(n^2)

Efficient Approach: There are 2 key observations for solving this problem:

1. Two numbers will have their GCD equal to one only when their prime factors are different.
2. Any positive number which is less than 109 can have a maximum of 9 prime factors.
For Example 2Ã—3Ã—5Ã—7Ã—11Ã—13Ã—17Ã—19Ã—23 = 22, 30, 92, 870. If we multiply this number by the next prime number, which is 29, it will be greater than 10^9.

Follow the steps below to solve the problem:

1. Express the numbers as the product of its prime factors. Since we have a maximum of 9 prime factors, we can use the concept of Bitmask to store the state of the number.
For Example, prime factors of 12 are 2 and 3. This can be expressed in binary as 11 (Ignoring the preceding zeroes), meaning two prime factors are there for this number.
2. For every number in the input array, check if any other number has the corresponding bit set or not. This could be achieved using Bitwise AND operation. The resultant of this operation is another state of our solution space.
3. Now use the concept of Dynamic Programming to memorize the states. The idea is to use an array to store the states of the solution space. This works since only 9 bits could be set a time, and an array of size 1024 could capture all the states of the solution space.
4. Every state uses dynamic programming to store the shortest way to reach that state.
5. If the Bitwise AND of any two states is equal to 0, then the GCD is equal to one, i.e., if there is a possibility to reach state 0 from the current state, then it will have the minimum length sub-sequence and print that length otherwise print “-1”.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function that finds the prime``// factors of a number``vector<``int``> findPrimeFactors(``int` `n)``{``    ``// To store the prime factor``    ``vector<``int``> primeFactors(9, 0);` `    ``int` `j = 0;` `    ``// 2s that divide n``    ``if` `(n % 2 == 0) {``        ``primeFactors[j++] = 2;``        ``while` `(n % 2 == 0)``            ``n >>= 1;``    ``}` `    ``// N must be odd at this point``    ``// Skip one element``    ``for` `(``int` `i = 3;``         ``i * i <= n; i += 2) {` `        ``if` `(n % i == 0) {` `            ``// Update the prime factor``            ``primeFactors[j++] = i;``            ``while` `(n % i == 0)``                ``n /= i;``        ``}``    ``}` `    ``// If n is a prime number``    ``// greater than 2``    ``if` `(n > 2)``        ``primeFactors[j++] = n;``    ` `    ``vector<``int``> PrimeFactors(j);``    ` `    ``for``(``int` `i = 0; i < j; i++)``    ``{``        ``PrimeFactors[i] = primeFactors[i];``    ``}``    ` `    ``return` `PrimeFactors;``}` `// Function that finds the shortest``// subsequence``void` `findShortestSubsequence(vector<``int``> &dp, vector<``int``> a,``                        ``int` `index, vector<``int``> primeFactors)``{``    ``int` `n = a.size();` `    ``for` `(``int` `j = index; j < n; j++) {``        ``int` `bitmask = 0;` `        ``for` `(``int` `p = 0;``             ``p < primeFactors.size(); p++) {` `            ``// Check if the prime factor``            ``// of first number, is also``            ``// the prime factor of the``            ``// rest numbers in array``            ``if` `((a[j] % primeFactors[p]) == 0) {` `                ``// Set corresponding bit``                ``// of prime factor to 1,``                ``// it means both these``                ``// numbers have the``                ``// same prime factor``                ``bitmask ^= (1 << p);``            ``}``        ``}` `        ``for` `(``int` `i = 0; i < dp.size(); i++) {` `            ``// If no states encountered``            ``// so far continue for this``            ``// combination of bits``            ``if` `(dp[i] == n + 1)``                ``continue``;` `            ``// Update this state with``            ``// minimum ways to reach``            ``// this state``            ``dp[bitmask & i]``                ``= min(dp[bitmask & i],``                           ``dp[i] + 1);``        ``}``    ``}``}` `// Function that print the minimum``// length of subsequence``void` `printMinimumLength(vector<``int``> a)``{``    ``int` `Min = a.size() + 1;` `    ``for` `(``int` `i = 0; i < a.size() - 1; i++) {` `        ``// Find the prime factors of``        ``// the first number``        ``vector<``int``> primeFactors``            ``= findPrimeFactors(a[i]);` `        ``int` `n = primeFactors.size();``    ` `        ``// Initialize the array with``        ``// maximum steps, size of the``        ``// array + 1 for instance``        ``vector<``int``> dp(1 << n, a.size() + 1);` `        ``// Express the prime factors``        ``// in bit representation` `        ``// Total number of set bits is``        ``// equal to the total number``        ``// of prime factors``        ``int` `setBits = (1 << n) - 1;` `        ``// Indicates there is one``        ``// way to reach the number``        ``// under consideration``        ``dp[setBits] = 1;``        ``findShortestSubsequence(dp, a, i + 1,``                                ``primeFactors);` `        ``// State 0 corresponds``        ``// to gcd of 1``        ``Min = min(dp[0], Min);``    ``}` `    ``// If not found such subsequence``    ``// then print "-1"``    ``if` `(Min == (a.size() + 1))``        ``cout << -1 << endl;` `    ``// Else print the length``    ``else``        ``cout << Min << endl;``}` `// Driver code``int` `main()``{``    ``// Given array arr[]``    ``vector<``int``> arr = { 2, 6, 12, 3 };``    ` `    ``// Function Call``    ``printMinimumLength(arr);``    ``return` `0;``}` `// This code is contributed by divyeshrabadiya07`

## Java

 `// Java program for the above approach``import` `java.io.*;``import` `java.util.*;` `class` `GFG {` `    ``// Function that finds the prime``    ``// factors of a number``    ``private` `static` `int``[] findPrimeFactors(``int` `n)``    ``{``        ``// To store the prime factor``        ``int``[] primeFactors = ``new` `int``[``9``];` `        ``int` `j = ``0``;` `        ``// 2s that divide n``        ``if` `(n % ``2` `== ``0``) {``            ``primeFactors[j++] = ``2``;``            ``while` `(n % ``2` `== ``0``)``                ``n >>= ``1``;``        ``}` `        ``// N must be odd at this point``        ``// Skip one element``        ``for` `(``int` `i = ``3``;``             ``i * i <= n; i += ``2``) {` `            ``if` `(n % i == ``0``) {` `                ``// Update the prime factor``                ``primeFactors[j++] = i;``                ``while` `(n % i == ``0``)``                    ``n /= i;``            ``}``        ``}` `        ``// If n is a prime number``        ``// greater than 2``        ``if` `(n > ``2``)``            ``primeFactors[j++] = n;` `        ``return` `Arrays.copyOfRange(primeFactors, ``0``, j);``    ``}` `    ``// Function that finds the shortest``    ``// subsequence``    ``private` `static` `void``    ``findShortestSubsequence(``int``[] dp, ``int``[] a,``                            ``int` `index,``                            ``int``[] primeFactors)``    ``{``        ``int` `n = a.length;` `        ``for` `(``int` `j = index; j < n; j++) {``            ``int` `bitmask = ``0``;` `            ``for` `(``int` `p = ``0``;``                 ``p < primeFactors.length; p++) {` `                ``// Check if the prime factor``                ``// of first number, is also``                ``// the prime factor of the``                ``// rest numbers in array``                ``if` `(a[j] % primeFactors[p] == ``0``) {` `                    ``// Set corresponding bit``                    ``// of prime factor to 1,``                    ``// it means both these``                    ``// numbers have the``                    ``// same prime factor``                    ``bitmask ^= (``1` `<< p);``                ``}``            ``}` `            ``for` `(``int` `i = ``0``;``                 ``i < dp.length; i++) {` `                ``// If no states encountered``                ``// so far continue for this``                ``// combination of bits``                ``if` `(dp[i] == n + ``1``)``                    ``continue``;` `                ``// Update this state with``                ``// minimum ways to reach``                ``// this state``                ``dp[bitmask & i]``                    ``= Math.min(dp[bitmask & i],``                               ``dp[i] + ``1``);``            ``}``        ``}``    ``}` `    ``// Function that print the minimum``    ``// length of subsequence``    ``private` `static` `void``    ``printMinimumLength(``int``[] a)``    ``{``        ``int` `min = a.length + ``1``;` `        ``for` `(``int` `i = ``0``;``             ``i < a.length - ``1``; i++) {` `            ``// Find the prime factors of``            ``// the first number``            ``int``[] primeFactors``                ``= findPrimeFactors(a[i]);` `            ``int` `n = primeFactors.length;` `            ``int``[] dp = ``new` `int``[``1` `<< n];` `            ``// Initialize the array with``            ``// maximum steps, size of the``            ``// array + 1 for instance``            ``Arrays.fill(dp, a.length + ``1``);` `            ``// Express the prime factors``            ``// in bit representation` `            ``// Total number of set bits is``            ``// equal to the total number``            ``// of prime factors``            ``int` `setBits = (``1` `<< n) - ``1``;` `            ``// Indicates there is one``            ``// way to reach the number``            ``// under consideration``            ``dp[setBits] = ``1``;``            ``findShortestSubsequence(dp, a, i + ``1``,``                                    ``primeFactors);` `            ``// State 0 corresponds``            ``// to gcd of 1``            ``min = Math.min(dp[``0``], min);``        ``}` `        ``// If not found such subsequence``        ``// then print "-1"``        ``if` `(min == a.length + ``1``)``            ``System.out.println(-``1``);` `        ``// Else print the length``        ``else``            ``System.out.println(min);``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``// Given array arr[]``        ``int``[] arr = { ``2``, ``6``, ``12``, ``3` `};` `        ``// Function Call``        ``printMinimumLength(arr);``    ``}``}`

## Python3

 `# Python3 program for the above approach` `# Function that finds the prime``# factors of a number``def` `findPrimeFactors(n):``    ` `    ``# To store the prime factor``    ``primeFactors ``=` `[``0` `for` `i ``in` `range``(``9``)]` `    ``j ``=` `0` `    ``# 2s that divide n``    ``if` `(n ``%` `2` `=``=` `0``):``        ``primeFactors[j] ``=` `2``        ``j ``+``=` `1``        ` `        ``while` `(n ``%` `2` `=``=` `0``):``            ``n >>``=` `1` `    ``# N must be odd at this point``    ``# Skip one element``    ``i ``=` `3``    ``while` `(i ``*` `i <``=` `n):``        ``if` `(n ``%` `i ``=``=` `0``):``            ` `            ``# Update the prime factor``            ``primeFactors[j] ``=` `i``            ``j ``+``=` `1``            ` `            ``while``(n ``%` `i ``=``=` `0``):``                ``n ``/``/``=` `i``                ` `        ``i ``+``=` `2` `    ``# If n is a prime number``    ``# greater than 2``    ``if` `(n > ``2``):``        ``primeFactors[j] ``=` `n``        ``j ``+``=` `1` `    ``for` `i ``in` `range``(``0``, j ``+` `1``):``        ``primeFactors[i] ``=` `0``        ` `    ``return` `primeFactors` `# Function that finds the shortest``# subsequence``def` `findShortestSubsequence(dp, a, index, ``                            ``primeFactors):``    ``n ``=` `len``(a)` `    ``for` `j ``in` `range``(index, n):``        ``bitmask ``=` `0` `        ``for` `p ``in` `range``(``len``(primeFactors)):``            ` `            ``# Check if the prime factor``            ``# of first number, is also``            ``# the prime factor of the``            ``# rest numbers in array``            ``if` `(primeFactors[p] !``=` `0` `and``                ``a[j] ``%` `primeFactors[p] ``=``=` `0``):``                    ` `                ``# Set corresponding bit``                ``# of prime factor to 1,``                ``# it means both these``                ``# numbers have the``                ``# same prime factor``                ``bitmask ^``=` `(``1` `<< p)` `        ``for` `i ``in` `range``(``len``(dp)):``            ` `            ``# If no states encountered``            ``# so far continue for this``            ``# combination of bits``            ``if` `(dp[i] ``=``=` `n ``+` `1``):``                ``continue` `            ``# Update this state with``            ``# minimum ways to reach``            ``# this state``            ``dp[bitmask & i] ``=` `min``(dp[bitmask & i],``                                  ``dp[i] ``+` `1``)` `# Function that print the minimum``# length of subsequence``def` `printMinimumLength(a):``    ` `    ``mn ``=` `len``(a) ``+` `1` `    ``for` `i ``in` `range``(``len``(a) ``-` `1``):` `        ``# Find the prime factors of``        ``# the first number``        ``primeFactors ``=` `findPrimeFactors(a[i])` `        ``n ``=` `len``(primeFactors)` `        ``dp ``=` `[``0` `for` `i ``in` `range``(``1` `<< n)]` `        ``# Initialize the array with``        ``# maximum steps, size of the``        ``# array + 1 for instance``        ``dp ``=` `[``len``(a) ``+` `1` `for` `i ``in` `range``(``len``(dp))]` `        ``# Express the prime factors``        ``# in bit representation` `        ``# Total number of set bits is``        ``# equal to the total number``        ``# of prime factors``        ``setBits ``=` `(``1` `<< n) ``-` `1` `        ``# Indicates there is one``        ``# way to reach the number``        ``# under consideration``        ``dp[setBits] ``=` `1``        ` `        ``findShortestSubsequence(dp, a, i ``+` `1``,``                                ``primeFactors)` `        ``# State 0 corresponds``        ``# to gcd of 1``        ``mn ``=` `min``(dp[``0``], mn)` `    ``# If not found such subsequence``    ``# then print "-1"``    ``if` `(mn ``=``=` `len``(a) ``+` `1``):``        ``print``(``-``1``)` `    ``# Else print the length``    ``else``:``        ``print``(mn)` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:``    ` `    ``# Given array arr[]``    ``arr ``=` `[ ``2``, ``6``, ``12``, ``3` `]` `    ``# Function Call``    ``printMinimumLength(arr)` `# This code is contributed by bgangwar59`

## Javascript

 ``

## C#

 `// C# program for``// the above approach``using` `System;``class` `GFG{` `// Function that finds the prime``// factors of a number``private` `static` `int``[] findPrimeFactors(``int` `n)``{``  ``// To store the prime factor``  ``int``[] primeFactors = ``new` `int``[9];` `  ``int` `j = 0;` `  ``// 2s that divide n``  ``if` `(n % 2 == 0) ``  ``{``    ``primeFactors[j++] = 2;``    ``while` `(n % 2 == 0)``      ``n >>= 1;``  ``}` `  ``// N must be odd at this point``  ``// Skip one element``  ``for` `(``int` `i = 3;``           ``i * i <= n; i += 2) ``  ``{``    ``if` `(n % i == 0) ``    ``{``      ``// Update the prime factor``      ``primeFactors[j++] = i;``      ``while` `(n % i == 0)``        ``n /= i;``    ``}``  ``}` `  ``// If n is a prime number``  ``// greater than 2``  ``if` `(n > 2)``    ``primeFactors[j++] = n;``  ` `  ``int` `[]temp = ``new` `int``[j];``  ``Array.Copy(primeFactors, temp, j);``  ``return` `temp;``}` `// Function that finds the shortest``// subsequence``private` `static` `void` `findShortestSubsequence(``int``[] dp, ``int``[] a,``                                            ``int` `index,``                                            ``int``[] primeFactors)``{``  ``int` `n = a.Length;` `  ``for` `(``int` `j = index; j < n; j++) ``  ``{``    ``int` `bitmask = 0;` `    ``for` `(``int` `p = 0;``             ``p < primeFactors.Length; p++) ``    ``{``      ``// Check if the prime factor``      ``// of first number, is also``      ``// the prime factor of the``      ``// rest numbers in array``      ``if` `(a[j] % primeFactors[p] == 0) ``      ``{``        ``// Set corresponding bit``        ``// of prime factor to 1,``        ``// it means both these``        ``// numbers have the``        ``// same prime factor``        ``bitmask ^= (1 << p);``      ``}``    ``}` `    ``for` `(``int` `i = 0;``             ``i < dp.Length; i++) ``    ``{``      ``// If no states encountered``      ``// so far continue for this``      ``// combination of bits``      ``if` `(dp[i] == n + 1)``        ``continue``;` `      ``// Update this state with``      ``// minimum ways to reach``      ``// this state``      ``dp[bitmask & i] = Math.Min(dp[bitmask & i],``                                 ``dp[i] + 1);``    ``}``  ``}``}` `// Function that print the minimum``// length of subsequence``private` `static` `void` `printMinimumLength(``int``[] a)``{``  ``int` `min = a.Length + 1;` `  ``for` `(``int` `i = 0;``           ``i < a.Length - 1; i++) ``  ``{``    ``// Find the prime factors of``    ``// the first number``    ``int``[] primeFactors = findPrimeFactors(a[i]);` `    ``int` `n = primeFactors.Length;` `    ``int``[] dp = ``new` `int``[1 << n];` `    ``// Initialize the array with``    ``// maximum steps, size of the``    ``// array + 1 for instance``    ``for``(i = 0; i < dp.Length; i++)``      ``dp[i] = a.Length + 1;` `    ``// Express the prime factors``    ``// in bit representation` `    ``// Total number of set bits is``    ``// equal to the total number``    ``// of prime factors``    ``int` `setBits = (1 << n) - 1;` `    ``// Indicates there is one``    ``// way to reach the number``    ``// under consideration``    ``dp[setBits] = 1;``    ``findShortestSubsequence(dp, a, i + 1,``                            ``primeFactors);` `    ``// State 0 corresponds``    ``// to gcd of 1``    ``min = Math.Min(dp[0], min);``  ``}` `  ``// If not found such subsequence``  ``// then print "-1"``  ``if` `(min == a.Length + 1)``    ``Console.WriteLine(-1);` `  ``// Else print the length``  ``else``    ``Console.WriteLine(min);``}` `// Driver Code``public` `static` `void` `Main(String[] args)``{``  ``// Given array []arr``  ``int``[] arr = {2, 6, 12, 3};` `  ``// Function Call``  ``printMinimumLength(arr);``}``}` `// This code is contributed by Rajput-Ji`

Output
`2`

Time Complexity: O(N2)
Auxiliary Space: O(2^k) where k is the number of factors of array elements.

Previous
Next