Convert the array such that the GCD of the array becomes 1
Given an array of positive elements and a positive integer k, the task is to convert the GCD of the array to 1. To make it possible, only one operation is allowed any number of times i.e. choose any element of the array & divide with a number d where d <= k.
Examples:
Input : arr = {10, 15, 30}, k = 6
Output : Yes
Divide all the elements of array by 5 as it is the divisor of all elements and also less than k i.e. 6. It gives as the sequence like {2, 3, 6}. Now, divide 2 by 2, 3 by 3 and 6 by 2. Then, the sequence becomes {1, 1, 3}. Now, the gcd of the array is 1.
Input : arr = {5, 10, 20}, k = 4
Output : No
Here, divide 10 with 2 the sequence becomes {5, 5, 20}. Then, divide 20 by 2 and again by 2. Finally, the sequence becomes {5, 5, 5}. To make the gcd of this sequence 1, divide each element by 5. But 5 > 4 so here it is impossible to make the gcd 1.
Approach:
- If there exists a positive prime number greater than k that divides each element of the array then the answer is No.
- If the largest prime factor of the GCD of the array is less than or equal to k then the answer is Yes.
- First, find the GCD of the array then check if there exists a prime factor of the GCD that is greater than k.
- For this, calculate largest prime factor of GCD.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int getGcd( int * arr, int n)
{
int gcd = arr[0];
for ( int i = 1; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
bool convertGcd( int * arr, int n, int k)
{
int gcd = getGcd(arr, n);
int max_prime = 1;
for ( int i = 2; i <= sqrt (gcd); i++) {
while (gcd % i == 0) {
gcd /= i;
max_prime = max(max_prime, i);
}
}
max_prime = max(max_prime, gcd);
return (max_prime <= k);
}
int main()
{
int arr[] = { 10, 15, 30 };
int k = 6;
int n = sizeof (arr) / sizeof (arr[0]);
if (convertGcd(arr, n, k) == true )
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.io.*;
class GFG {
static int __gcd( int a, int b)
{
if (a == 0 || b == 0 )
return 0 ;
if (a == b)
return a;
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
static int getGcd( int arr[], int n)
{
int gcd = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
static boolean convertGcd( int []arr,
int n, int k)
{
int gcd = getGcd(arr, n);
int max_prime = 1 ;
for ( int i = 2 ; i <= Math.sqrt(gcd);
i++)
{
while (gcd % i == 0 ) {
gcd /= i;
max_prime =
Math.max(max_prime, i);
}
}
max_prime = Math.max(max_prime, gcd);
return (max_prime <= k);
}
public static void main (String[] args)
{
int []arr = { 10 , 15 , 30 };
int k = 6 ;
int n = arr.length;
if (convertGcd(arr, n, k) == true )
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python3
from math import gcd as __gcd, sqrt
def getGcd(arr, n):
gcd = arr[ 0 ];
for i in range ( 1 , n, 1 ):
gcd = __gcd(arr[i], gcd)
return gcd
def convertGcd(arr, n, k):
gcd = getGcd(arr, n)
max_prime = 1
p = int (sqrt(gcd)) + 1
for i in range ( 2 , p, 1 ):
while (gcd % i = = 0 ):
gcd = int (gcd / i)
max_prime = max (max_prime, i)
max_prime = max (max_prime, gcd)
return (max_prime < = k)
if __name__ = = '__main__' :
arr = [ 10 , 15 , 30 ]
k = 6
n = len (arr)
if (convertGcd(arr, n, k) = = True ):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG {
static int __gcd( int a, int b)
{
if (a == 0 || b == 0)
return 0;
if (a == b)
return a;
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
static int getGcd( int []arr, int n)
{
int gcd = arr[0];
for ( int i = 1; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
static bool convertGcd( int []arr,
int n, int k)
{
int gcd = getGcd(arr, n);
int max_prime = 1;
for ( int i = 2; i <= Math.Sqrt(gcd);
i++)
{
while (gcd % i == 0) {
gcd /= i;
max_prime =
Math.Max(max_prime, i);
}
}
max_prime = Math.Max(max_prime, gcd);
return (max_prime <= k);
}
public static void Main ()
{
int []arr = { 10, 15, 30 };
int k = 6;
int n = arr.Length;
if (convertGcd(arr, n, k) == true )
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
PHP
<?php
function __gcd( $a , $b )
{
if ( $a == 0 or $b == 0)
return 0 ;
if ( $a == $b )
return $a ;
if ( $a > $b )
return __gcd( $a - $b , $b ) ;
return __gcd( $a , $b - $a ) ;
}
function getGcd( $arr , $n )
{
$gcd = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$gcd = __gcd( $arr [ $i ], $gcd );
return $gcd ;
}
function convertGcd( $arr , $n , $k )
{
$gcd = getGcd( $arr , $n );
$max_prime = 1;
for ( $i = 2; $i <= sqrt( $gcd ); $i ++)
{
while ( $gcd % $i == 0)
{
$gcd /= $i ;
$max_prime = max( $max_prime , $i );
}
}
$max_prime = max( $max_prime , $gcd );
return ( $max_prime <= $k );
}
$arr = array (10, 15, 30);
$k = 6;
$n = count ( $arr );
if (convertGcd( $arr , $n , $k ) == true)
echo "Yes" ;
else
echo "No" ;
?>
|
Javascript
<script>
function __gcd(a, b)
{
if (a == 0 || b == 0)
return 0;
if (a == b)
return a;
if (a > b)
return __gcd(a-b, b);
return __gcd(a, b-a);
}
function getGcd(arr, n)
{
let gcd = arr[0];
for (let i = 1; i < n; i++)
gcd = __gcd(arr[i], gcd);
return gcd;
}
function convertGcd(arr, n, k)
{
let gcd = getGcd(arr, n);
let max_prime = 1;
for (let i = 2; i <= Math.sqrt(gcd); i++)
{
while (gcd % i == 0) {
gcd = parseInt(gcd / i, 10);
max_prime = Math.max(max_prime, i);
}
}
max_prime = Math.max(max_prime, gcd);
return (max_prime <= k);
}
let arr = [ 10, 15, 30 ];
let k = 6;
let n = arr.length;
if (convertGcd(arr, n, k) == true )
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Complexity Analysis:
- Time Complexity: O(n), to iterate over the array
- Auxiliary Space: O(1), as no extra space is required
Last Updated :
19 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...