Largest subarray with GCD one

There is an array with n elements. Find length of the largest subarray having GCD equal to 1. If no subarray with GCD 1, then print -1.

Examples :

Input  : 1 3 5 
Output : 3

Input : 2 4 6
Output :-1



A simple solution is to consider every subarray and find its GCD and keep track of largest subarray with GCD one. Finally return length of the largest subarray with GCD 1.

An efficient solution is based on fact that if any two elements have GCD equals to one, then whole array has GCD one. So the output is either -1 or length of array.

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ progra, to find length of the largest
// subarray with GCD equals to 1.
#include<bits/stdc++.h>
using namespace std;
  
int findLargest(int arr[], int n)
{
    /*If gcd of any subarray is 1 then gcd of
     any number with the sub array will be 1.
     so if we are getting any subarray with
     gcd 1, then maximum number of element of
      the subarray will be equal to the number
      of elements of the array. Else it will be -1.*/
    int gcd = arr[0];
    for (int i=1; i<n; i++)
        gcd = __gcd(gcd, arr[i]);
  
    return (gcd == 1)? n : -1;
}
  
// Driver code
int main()
{
    int arr[] = {1, 3, 5, 7};
    int n = sizeof(arr)/sizeof(int);
    cout << "Length of the largest subarray = "
         << findLargest(arr, n);
    return 0;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program, to find length of the 
// largest subarray with GCD equals to 1.
class GFG {
      
    static int ___gcd(int a, int b)
    {
          
        // Everything divides 0 
        if (a == 0 || b == 0)
            return 0;
      
        // base case
        if (a == b)
            return a;
      
        // a is greater
        if (a > b)
            return ___gcd(a - b, b);
              
        return ___gcd(a, b - a);
    
      
    static int findLargest(int arr[], 
                                int n)
    {
          
        /*If gcd of any subarray is 1 
        then gcd of any number with the 
        sub array will be 1. so if we 
        are getting any subarray with
        gcd 1, then maximum number of
        element of the subarray will 
        be equal to the number of  
        elements of the array. Else 
        it will be -1.*/
        int gcd = arr[0];
          
        for (int i = 1; i < n; i++)
            gcd = ___gcd(gcd, arr[i]);
      
        return (gcd == 1)? n : -1;
    }
      
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = {1, 3, 5, 7};
        int n = arr.length;
          
        System.out.print("Length of the " 
                   + "largest subarray = "
                   + findLargest(arr, n));
    }
}
  
// This code is contributed by Anant Agarwal.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program, to find
# length of the largest
# subarray with GCD equals to 1.
  
def ___gcd(a,b):
  
    # Everything divides 0 
    if (a == 0 or b == 0):
        return 0
   
    # base case
    if (a == b):
        return a
   
    # a is greater
    if (a > b):
        return ___gcd(a-b, b)
    return ___gcd(a, b-a)
      
def findLargest(arr, n): 
  
    '''If gcd of any subarray is 1 then gcd of
     any number with the sub array will be 1.
     so if we are getting any subarray with
     gcd 1, then maximum number of element of
      the subarray will be equal to the number
      of elements of the array. Else it will be -1.'''
    gcd = arr[0]
    for i in range(1,n):
        gcd = ___gcd(gcd, arr[i])
   
    return n if (gcd == 1) else -1
      
# Driver code
arr=[1, 3, 5, 7]
n=len(arr)
  
print("Length of the largest subarray = ",
         findLargest(arr, n))
  
# This code is contributed
# by Anant Agarwal.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program, to find length of the 
// largest subarray with GCD equals to 1.
using System;
  
class GFG {
      
    static int ___gcd(int a, int b)
    {
          
        // Everything divides 0 
        if (a == 0 || b == 0)
            return 0;
      
        // base case
        if (a == b)
            return a;
      
        // a is greater
        if (a > b)
            return ___gcd(a - b, b);
              
        return ___gcd(a, b - a);
    
      
    static int findLargest(int []arr, 
                           int n)
    {
          
        // If gcd of any subarray is 1 
        // then gcd of any number with the 
        // sub array will be 1. so if we 
        // are getting any subarray with
        // gcd 1, then maximum number of
        // element of the subarray will 
        // be equal to the number of 
        // elements of the array. Else 
        // it will be -1.
        int gcd = arr[0];
          
        for (int i = 1; i < n; i++)
            gcd = ___gcd(gcd, arr[i]);
      
        return (gcd == 1)? n : -1;
    }
      
    // Driver code
    public static void Main ()
    {
        int []arr = {1, 3, 5, 7};
        int n = arr.Length;
          
        Console.Write("Length of the "
                       + "largest subarray = "
                       + findLargest(arr, n));
    }
}
  
// This code is contributed by Nitin Mittal.
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program, to find length 
// of the largest subarray with 
// GCD equals to 1.
function ___gcd($a, $b)
{
    // Everything divides 0 
    if ($a == 0 || $b == 0)
        return 0;
  
    // base case
    if ($a == $b)
        return $a;
  
    // a is greater
    if ($a > $b)
        return ___gcd($a - $b, $b);
          
    return ___gcd($a, $b - $a);
  
function findLargest($arr, $n)
{
      
    /*If gcd of any subarray is 1 
    then gcd of any number with the 
    sub array will be 1. so if we 
    are getting any subarray with
    gcd 1, then maximum number of
    element of the subarray will 
    be equal to the number of 
    elements of the array. Else 
    it will be -1.*/
    $gcd = $arr[0];
      
    for ($i = 1; $i < $n; $i++)
        $gcd = ___gcd($gcd, $arr[$i]);
  
    return ($gcd == 1)? $n : -1;
}
  
// Driver code
$arr = array(1, 3, 5, 7);
$n = count($arr);
  
echo "Length of the "
     "largest subarray = "
      findLargest($arr, $n);
  
// This code is contributed by Sam007
?>
chevron_right


Output :
Length of the largest subarray = 4

This article is contributed by Smarak Chopdar. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.




Improved By : nitin mittal, Sam007



Article Tags :
Practice Tags :