Check if elements of array can be made equal by multiplying given prime numbers
Given an array of integers and an array of prime numbers. The task is to find if it is possible to make all the elements of integer array equal by multiplying one or more elements from prime given array of prime numbers.
Examples:
Input : arr[] = {50, 200}
prime[] = {2, 3}
Output : Yes
We can multiply 50 with 2 two times
to make both elements of arr[] equal
Input : arr[] = {3, 4, 5, 6, 2}
prime[] = {2, 3}
Output : No
We find LCM of all array elements. All elements can be made equal only if it is possible to convert all numbers to LCM. So we find the multiplier for each element so that we can make that element equal to LCM by multiplying that number. After that we find if numbers from given primes can form given multiplier.
Algorithm-
Step 1: Find LCM of all numbers in the array O(n)
Step 2 : For each number arr[i]
——– Divide LCM by arr[i]
——– Use each input prime number to divide the result to remove all factors of input prime numbers (can use modulo to check divisibility)
——– If left over number is not 1, return false;
Step 3 : Return true
Below is the implementation of above algorithm.
C++
#include<bits/stdc++.h>
using namespace std;
int lcmOfArray( int arr[], int n)
{
int ans = arr[0];
for ( int i=1; i<n; i++)
ans = (arr[i]*ans)/__gcd(arr[i], ans);
return ans;
}
bool checkArray( int arr[], int prime[], int n, int m)
{
int lcm = lcmOfArray(arr,n);
for ( int i=0; i<n; i++)
{
int val = lcm/arr[i];
for ( int j=0; j<m && val!=1; j++)
while (val % prime[j] == 0)
val = val/prime[j];
if (val != 1)
return false ;
}
return true ;
}
int main()
{
int arr[] = {50, 200};
int prime[] = {2, 3};
int n = sizeof (arr)/ sizeof (arr[0]);
int m = sizeof (prime)/ sizeof (prime[0]);
checkArray(arr, prime, n, m)? cout << "Yes" :
cout << "No" ;
return 0;
}
|
Java
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 lcmOfArray( int arr[], int n)
{
int ans = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
ans = (arr[i] * ans)/ ___gcd(arr[i], ans);
return ans;
}
static boolean checkArray( int arr[], int prime[],
int n, int m)
{
int lcm = lcmOfArray(arr,n);
for ( int i = 0 ; i < n; i++)
{
int val = lcm / arr[i];
for ( int j = 0 ; j < m && val != 1 ; j++)
while (val % prime[j] == 0 )
val = val / prime[j];
if (val != 1 )
return false ;
}
return true ;
}
public static void main (String[] args)
{
int arr[] = { 50 , 200 };
int prime[] = { 2 , 3 };
int n = arr.length;
int m = prime.length;
if (checkArray(arr, prime, n, m))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def ___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)
def lcmOfArray(arr,n):
ans = arr[ 0 ]
for i in range ( 1 ,n):
ans = (arr[i] * ans) / ___gcd(arr[i], ans)
return ans
def checkArray(arr, prime, n, m):
lcm = lcmOfArray(arr, n)
for i in range (n):
val = lcm / arr[i]
for j in range (m and val! = 1 ):
while (val % prime[j] = = 0 ):
val = val / prime[j]
if (val ! = 1 ):
return 0
return 1
arr = [ 50 , 200 ]
prime = [ 2 , 3 ]
n = len (arr)
m = len (prime)
if (checkArray(arr, prime, n, m)):
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 lcmOfArray( int []arr, int n)
{
int ans = arr[0];
for ( int i = 1; i < n; i++)
ans = ((arr[i] * ans) /
___gcd(arr[i], ans));
return ans;
}
static bool checkArray( int []arr,
int []prime, int n, int m)
{
int lcm = lcmOfArray(arr, n);
for ( int i = 0; i < n; i++)
{
int val = lcm / arr[i];
for ( int j = 0; j < m &&
val != 1; j++)
while (val % prime[j] == 0)
val = val / prime[j];
if (val != 1)
return false ;
}
return true ;
}
public static void Main ()
{
int []arr = {50, 200};
int []prime = {2, 3};
int n = arr.Length;
int m = prime.Length;
if (checkArray(arr, prime, n, m))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
PHP
<?php
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 lcmOfArray( $arr , $n )
{
$ans = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$ans = (( $arr [ $i ] * $ans ) /
___gcd( $arr [ $i ], $ans ));
return $ans ;
}
function checkArray( $arr , $prime ,
$n , $m )
{
$lcm = lcmOfArray( $arr , $n );
for ( $i = 0; $i < $n ; $i ++)
{
$val = $lcm / $arr [ $i ];
for ( $j = 0; $j < $m &&
$val != 1; $j ++)
while ( $val % $prime [ $j ] == 0)
$val = $val / $prime [ $j ];
if ( $val != 1)
return false;
}
return true;
}
$arr = array (50, 200);
$prime = array (2, 3);
$n = sizeof( $arr );
$m = sizeof( $prime );
if (checkArray( $arr , $prime ,
$n , $m ))
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 lcmOfArray(arr, n)
{
let ans = arr[0];
for (let i = 1; i < n; i++)
ans = (arr[i] * ans)/ ___gcd(arr[i], ans);
return ans;
}
function checkArray(arr, prime, n, m)
{
let lcm = lcmOfArray(arr,n);
for (let i = 0; i < n; i++)
{
let val = lcm / arr[i];
for (let j = 0; j < m && val != 1; j++)
while (val % prime[j] == 0)
val = val / prime[j];
if (val != 1)
return false ;
}
return true ;
}
let arr = [50, 200];
let prime = [2, 3];
let n = arr.length;
let m = prime.length;
if (checkArray(arr, prime, n, m))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Output:
Yes
Time Complexity: O(m x n)
Auxiliary Space: O(1)
Last Updated :
23 Jun, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...