Given an array of integers. Find an integer X which is the divisor of all except for exactly one element in the given array.
Note: The GCD of all the elements is not 1.
Examples:
Input : arr[] = {6, 18, 3, 12} Output : 6 6 is the divisor of all except 3. Input : arr[] = {40, 15, 30, 42} Output : 3 3 is the divisor of all except 40.
Approach: Make a prefix array P such that index i contains the GCD of all the elements from 1 to i. Similarly, make a suffix array S such that index i contains the GCD of all the elements from i to n-1 (last index). If the GCD of P[i-1] and S[i+1] is not the divisor of the element at i, then it is the required answer.
Below is the implementation of the above approach:
// C++ program to find the divisor of all // except for exactly one element in an array. #include <bits/stdc++.h> using namespace std;
// Function that returns the divisor of all // except for exactly one element in an array. int getDivisor( int a[], int n)
{ // There's only one element in the array
if (n == 1)
return (a[0] + 1);
int P[n], S[n];
// Creating prefix array of GCD
P[0] = a[0];
for ( int i = 1; i < n; i++)
P[i] = __gcd(a[i], P[i - 1]);
// Creating suffix array of GCD
S[n-1] = a[n-1];
for ( int i = n - 2; i >= 0; i--)
S[i] = __gcd(S[i + 1], a[i]);
// Iterate through the array
for ( int i = 0; i <= n; i++) {
// Variable to store the divisor
int cur;
// Getting the divisor
if (i == 0)
cur = S[i + 1];
else if (i == n - 1)
cur = P[i - 1];
else
cur = __gcd(P[i - 1], S[i + 1]);
// Check if it is not a divisor of a[i]
if (a[i] % cur != 0)
return cur;
}
return 0;
} // Driver code int main()
{ int a[] = { 12, 6, 18, 12, 16 };
int n = sizeof (a) / sizeof (a[0]);
cout << getDivisor(a, n);
return 0;
} |
// Java program to find the divisor of all // except for exactly one element in an array. import java.io.*;
class GFG {
// Recursive function to return gcd of a and b static int __gcd( int a, int b)
{
// Everything divides 0
if (a == 0 )
return b;
if (b == 0 )
return a;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
// Function that returns the divisor of all // except for exactly one element in an array. static int getDivisor( int a[], int n)
{ // There's only one element in the array
if (n == 1 )
return (a[ 0 ] + 1 );
int P[] = new int [n];
int S[] = new int [n];
// Creating prefix array of GCD
P[ 0 ] = a[ 0 ];
for ( int i = 1 ; i < n; i++)
P[i] = __gcd(a[i], P[i - 1 ]);
// Creating suffix array of GCD
S[n- 1 ] = a[n- 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
S[i] = __gcd(S[i + 1 ], a[i]);
// Iterate through the array
for ( int i = 0 ; i < n; i++) {
// Variable to store the divisor
int cur;
// Getting the divisor
if (i == 0 )
cur = S[i + 1 ];
else if (i == n - 1 )
cur = P[i - 1 ];
else
cur = __gcd(P[i - 1 ], S[i + 1 ]);
// Check if it is not a divisor of a[i]
if (a[i] % cur != 0 )
return cur;
}
return 0 ;
} // Driver code public static void main (String[] args) {
int a[] = { 12 , 6 , 18 , 12 , 16 };
int n = a.length;
System.out.println(getDivisor(a, n));
}
} // This code is contributed by anuj_67.. |
# Python 3 program to find the divisor of all # except for exactly one element in an array. from math import gcd
# Function to find the divisor of all # except for exactly one element in an array. def getDivisor(a, n):
# There's only one element in the array
if (n = = 1 ):
return (a[ 0 ] + 1 )
P = [ 0 ] * n
S = [ 0 ] * n
# Creating prefix array of GCD
P[ 0 ] = a[ 0 ]
for i in range ( 1 , n):
P[i] = gcd(a[i], P[i - 1 ])
# Creating suffix array of GCD
S[n - 1 ] = a[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
S[i] = gcd(S[i + 1 ], a[i])
# Iterate through the array
for i in range ( 0 , n + 1 ):
# Variable to store the divisor
cur = 0
# Getting the divisor
if (i = = 0 ):
cur = S[i + 1 ]
elif (i = = n - 1 ):
cur = P[i - 1 ]
else :
cur = gcd(P[i - 1 ], S[i + 1 ])
# Check if it is not a divisor of a[i]
if (a[i] % cur ! = 0 ):
return cur
return 0 ;
# Driver Code if __name__ = = '__main__' :
a = [ 12 , 6 , 18 , 12 , 16 ]
n = len (a)
print (getDivisor(a, n))
# This code is contributed by Rupesh Rao |
// C# program to find the divisor of all // except for exactly one element in an array. using System;
class GFG
{ // Recursive function to return gcd of a and b static int __gcd( int a, int b)
{ // Everything divides 0
if (a == 0)
return b;
if (b == 0)
return a;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
} // Function that returns the divisor of all // except for exactly one element in an array. static int getDivisor( int [] a, int n)
{ // There's only one element in the array
if (n == 1)
return (a[0] + 1);
int [] P = new int [n];
int [] S = new int [n];
// Creating prefix array of GCD
P[0] = a[0];
for ( int i = 1; i < n; i++)
P[i] = __gcd(a[i], P[i - 1]);
// Creating suffix array of GCD
S[n - 1] = a[n - 1];
for ( int i = n - 2; i >= 0; i--)
S[i] = __gcd(S[i + 1], a[i]);
// Iterate through the array
for ( int i = 0; i <= n; i++)
{
// Variable to store the divisor
int cur;
// Getting the divisor
if (i == 0)
cur = S[i + 1];
else if (i == n - 1)
cur = P[i - 1];
else
cur = __gcd(P[i - 1], S[i + 1]);
// Check if it is not a divisor of a[i]
if (a[i] % cur != 0)
return cur;
}
return 0;
} // Driver code public static void Main ()
{ int [] a = { 12, 6, 18, 12, 16 };
int n = a.Length;
Console.WriteLine(getDivisor(a, n));
} } // This code is contributed // by Akanksha Rai |
<?php // PHP program to find the divisor of all // except for exactly one element in an array. // Recursive function to return // gcd of a and b function __gcd( $a , $b )
{ // Everything divides 0
if ( $a == 0)
return b;
if ( $b == 0)
return $a ;
// base case
if ( $a == $b )
return $a ;
// a is greater
if ( $a > $b )
return __gcd( $a - $b , $b );
return __gcd( $a , $b - $a );
} // Function that returns the divisor of all // except for exactly one element in an array. function getDivisor( $a , $n )
{ // There's only one element in the array
if ( $n == 1)
return ( $a [0] + 1);
$P = array () ;
$S = array () ;
// Creating prefix array of GCD
$P [0] = $a [0];
for ( $i = 1; $i < $n ; $i ++)
$P [ $i ] = __gcd( $a [ $i ], $P [ $i - 1]);
// Creating suffix array of GCD
$S [ $n - 1] = $a [ $n - 1];
for ( $i = $n - 2; $i >= 0; $i --)
$S [ $i ] = __gcd( $S [ $i + 1], $a [ $i ]);
// Iterate through the array
for ( $i = 0; $i <= $n ; $i ++)
{
// Getting the divisor
if ( $i == 0)
$cur = $S [ $i + 1];
else if ( $i == $n - 1)
$cur = $P [ $i - 1];
else
$cur = __gcd( $P [ $i - 1], $S [ $i + 1]);
// Check if it is not a divisor of a[i]
if ( $a [ $i ] % $cur != 0)
return $cur ;
}
return 0;
} // Driver code $a = array ( 12, 6, 18, 12, 16 );
$n = sizeof( $a );
echo getDivisor( $a , $n );
// This code is contributed by Ryuga ?> |
<script> // Javascript program to find the // divisor of all except for exactly // one element in an array. // Recursive function to return gcd of a and b function __gcd(a, b)
{ // Everything divides 0
if (a == 0)
return b;
if (b == 0)
return a;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
} // Function that returns the divisor of all // except for exactly one element in an array. function getDivisor(a, n)
{ // There's only one element in the array
if (n == 1)
return (a[0] + 1);
var P = new Array(n);
var S = new Array(n);
// Creating prefix array of GCD
P[0] = a[0];
for ( var i = 1; i < n; i++)
P[i] = __gcd(a[i], P[i - 1]);
// Creating suffix array of GCD
S[n-1] = a[n-1];
for ( var i = n - 2; i >= 0; i--)
S[i] = __gcd(S[i + 1], a[i]);
// Iterate through the array
for ( var i = 0; i < n; i++) {
// Variable to store the divisor
var cur;
// Getting the divisor
if (i == 0)
cur = S[i + 1];
else if (i == n - 1)
cur = P[i - 1];
else
cur = __gcd(P[i - 1], S[i + 1]);
// Check if it is not a divisor of a[i]
if (a[i] % cur != 0)
return cur;
}
return 0;
} // Driver Code var a = [ 12, 6, 18, 12, 16 ];
var n = a.length;
document.write(getDivisor(a, n)); // This code is contributed by kirti </script> |
6
Complexity Analysis:
- Time Complexity: O(nlogn)
- Auxiliary Space: O(n)