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.
C++
// C++ program, 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; } |
Java
// 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. |
Python3
# 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. |
C#
// 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. |
PHP
<?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 ?> |
Javascript
<script> // Javascript 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.*/ let gcd = arr[0]; for (let i = 1; i < n; i++) gcd = ___gcd(gcd, arr[i]); return (gcd == 1)? n : -1; } // Driver Code let arr = [1, 3, 5, 7]; let n = arr.length; document.write( "Length of the " + "largest subarray = " + findLargest(arr, n)); </script> |
Length of the largest subarray = 4
Time Complexity: O(log(min(n)))
Auxiliary Space: O(1)
This article is contributed by Aarti_Rathi and Smarak Chopdar. If you like neveropen and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the neveropen main page and help other Geeks.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!