Smallest perfect square divisible by all elements of an array
Last Updated :
14 Sep, 2022
Given an array arr[], the task is to find the smallest perfect square which is divisible by all the elements of the given array.
Examples:
Input: arr[] = {2, 3, 4, 5, 7}
Output: 44100
Input: arr[] = {20, 25, 14, 21, 100, 18, 42, 16, 55}
Output: 21344400
Naive Approach: Check one by one all square number starting from 1 and select the one which is divisible by all the elements of the array.
Efficient Approach: Find the least common multiple of all the elements of the array and store it in a variable lcm. Find all prime factor of the found LCM.
Now check if there are any prime factors which divide the lcm odd number of times. If there are such factors, multiply LCM by those factors. Print the updated LCM in the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
ll gcd(ll a, ll b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
ll lcmOfArray( int arr[], int n)
{
if (n < 1)
return 0;
ll lcm = arr[0];
for ( int i = 1; i < n; i++)
lcm = (lcm * arr[i]) / gcd(lcm, arr[i]);
return lcm;
}
int minPerfectSquare( int arr[], int n)
{
ll minPerfectSq;
ll lcm = lcmOfArray(arr, n);
minPerfectSq = ( long long )lcm;
int cnt = 0;
while (lcm > 1 && lcm % 2 == 0) {
cnt++;
lcm /= 2;
}
if (cnt % 2 != 0)
minPerfectSq *= 2;
int i = 3;
while (lcm > 1) {
cnt = 0;
while (lcm % i == 0) {
cnt++;
lcm /= i;
}
if (cnt % 2 != 0)
minPerfectSq *= i;
i += 2;
}
return minPerfectSq;
}
int main()
{
int arr[] = { 2, 3, 4, 5, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << minPerfectSquare(arr, n);
return 0;
}
|
Java
import java.util.*;
class solution
{
static int gcd( int a, int b)
{
if (b == 0 )
return a;
else
return gcd(b, a % b);
}
static int lcmOfArray( int arr[], int n)
{
if (n < 1 )
return 0 ;
int lcm = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
lcm = (lcm * arr[i]) / gcd(lcm, arr[i]);
return lcm;
}
static int minPerfectSquare( int arr[], int n)
{
int minPerfectSq;
int lcm = lcmOfArray(arr, n);
minPerfectSq = ( int )lcm;
int cnt = 0 ;
while (lcm > 1 && lcm % 2 == 0 ) {
cnt++;
lcm /= 2 ;
}
if (cnt % 2 != 0 )
minPerfectSq *= 2 ;
int i = 3 ;
while (lcm > 1 ) {
cnt = 0 ;
while (lcm % i == 0 ) {
cnt++;
lcm /= i;
}
if (cnt % 2 != 0 )
minPerfectSq *= i;
i += 2 ;
}
return minPerfectSq;
}
public static void main(String args[])
{
int arr[] = { 2 , 3 , 4 , 5 , 7 };
int n = arr.length;
System.out.println(minPerfectSquare(arr, n));
}
}
|
Python3
from math import gcd
def lcmOfArray(arr, n):
if (n < 1 ):
return 0
lcm = arr[ 0 ]
for i in range ( 1 , n, 1 ):
lcm = int ((lcm * arr[i]) /
gcd(lcm, arr[i]))
return lcm
def minPerfectSquare(arr, n):
lcm = lcmOfArray(arr, n)
minPerfectSq = int (lcm)
cnt = 0
while (lcm > 1 and lcm % 2 = = 0 ):
cnt + = 1
lcm / = 2
if (cnt % 2 ! = 0 ):
minPerfectSq * = 2
i = 3
while (lcm > 1 ):
cnt = 0 ;
while (lcm % i = = 0 ):
cnt + = 1
lcm / = i
if (cnt % 2 ! = 0 ):
minPerfectSq * = i
i + = 2
return minPerfectSq
if __name__ = = '__main__' :
arr = [ 2 , 3 , 4 , 5 , 7 ]
n = len (arr)
print (minPerfectSquare(arr, n))
|
C#
using System;
public class GFG{
static int gcd( int a, int b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
static int lcmOfArray( int []arr, int n)
{
if (n < 1)
return 0;
int lcm = arr[0];
for ( int i = 1; i < n; i++)
lcm = (lcm * arr[i]) / gcd(lcm, arr[i]);
return lcm;
}
static int minPerfectSquare( int []arr, int n)
{
int minPerfectSq;
int lcm = lcmOfArray(arr, n);
minPerfectSq = ( int )lcm;
int cnt = 0;
while (lcm > 1 && lcm % 2 == 0) {
cnt++;
lcm /= 2;
}
if (cnt % 2 != 0)
minPerfectSq *= 2;
int i = 3;
while (lcm > 1) {
cnt = 0;
while (lcm % i == 0) {
cnt++;
lcm /= i;
}
if (cnt % 2 != 0)
minPerfectSq *= i;
i += 2;
}
return minPerfectSq;
}
static public void Main (){
int []arr = { 2, 3, 4, 5, 7 };
int n = arr.Length;
Console.WriteLine(minPerfectSquare(arr, n));
}
}
|
PHP
<?php
function gcd( $a , $b )
{
if ( $b == 0)
return $a ;
else
return gcd( $b , $a % $b );
}
function lcmOfArray( $arr , $n )
{
if ( $n < 1)
return 0;
$lcm = $arr [0];
for ( $i = 1; $i < $n ; $i ++)
$lcm = ( $lcm * $arr [ $i ]) /
gcd( $lcm , $arr [ $i ]);
return $lcm ;
}
function minPerfectSquare( $arr , $n )
{
$lcm = lcmOfArray( $arr , $n );
$minPerfectSq = $lcm ;
$cnt = 0;
while ( $lcm > 1 && $lcm % 2 == 0)
{
$cnt ++;
$lcm = floor ( $lcm / 2);
}
if ( $cnt % 2 != 0)
$minPerfectSq *= 2;
$i = 3;
while ( $lcm > 1)
{
$cnt = 0;
while ( $lcm % $i == 0)
{
$cnt ++;
$lcm = $lcm / $i ;
}
if ( $cnt % 2 != 0)
$minPerfectSq *= $i ;
$i += 2;
}
return $minPerfectSq ;
}
$arr = array ( 2, 3, 4, 5, 7 );
$n = sizeof( $arr );
echo minPerfectSquare( $arr , $n );
?>
|
Javascript
<script>
function gcd(a, b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
function lcmOfArray(arr, n)
{
if (n < 1)
return 0;
let lcm = arr[0];
for (let i = 1; i < n; i++)
lcm = parseInt((lcm * arr[i]) / gcd(lcm, arr[i]), 10);
return lcm;
}
function minPerfectSquare(arr, n)
{
let minPerfectSq;
let lcm = lcmOfArray(arr, n);
minPerfectSq = lcm;
let cnt = 0;
while (lcm > 1 && lcm % 2 == 0) {
cnt++;
lcm = parseInt(lcm / 2, 10);
}
if (cnt % 2 != 0)
minPerfectSq *= 2;
let i = 3;
while (lcm > 1) {
cnt = 0;
while (lcm % i == 0) {
cnt++;
lcm = parseInt(lcm / i, 10);
}
if (cnt % 2 != 0)
minPerfectSq *= i;
i += 2;
}
return minPerfectSq;
}
let arr = [ 2, 3, 4, 5, 7 ];
let n = arr.length;
document.write(minPerfectSquare(arr, n));
</script>
|
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...