Modify array such that the array does not contain any common divisors other than 1
Last Updated :
14 Feb, 2022
Given an array arr[] consisting of N integers and an integer X, the task is to check if it is possible to modify the array such that the array does not contain any common divisor other than 1, by repeatedly dividing any array element of the array by any of its divisor d (d ≤ X). If it is possible to modify the array such that it satisfies the given conditions, then print “Yes”. Otherwise, print “No”.
Examples:
Input: arr[] = {6, 15, 6}, X = 6
Output:
Yes
2 5 2
Explanation:
Operation 1: Dividing arr[0] by 3 (Since 3 ≤ 6) modifies arr[] to { 2, 15, 6 }.
Operation 2: Dividing arr[1] by 5 (Since 5 ≤ 6) modifies arr[] to { 2, 3, 6 }.
Therefore, GCD of the array = GCD({2, 3, 6}) = 1, which means that the array has no common divisor other than 1, which is the required condition.
Input: arr[] = {10, 20, 30}, X = 4
Output: No
Approach: The idea is to use Euclidean’s GCD to find the GCD of the given array. This gives all the common factors of array elements. By removing all these factors, no common factor remains. Therefore, such an array can be generated. Otherwise, it is not possible to generate such an array.
Follow the steps below to solve the problem:
- Initialize a variable, say G, to store the GCD of the given array.
- Traverse the array arr[] and compute the GCD and store it in a variable, say G.
- Iterate over the range [2, X] and check whether G has a divisor greater than X or not.
- If found to be true, then print “No”. Otherwise, print “Yes”.
- Otherwise, print the array elements after modifying the array by dividing all elements by G.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void checkCommonDivisor( int arr[],
int N, int X)
{
int G = 0;
for ( int i = 0; i < N; i++) {
G = __gcd(G, arr[i]);
}
int copy_G = G;
for ( int divisor = 2;
divisor <= X; divisor++) {
while (G % divisor == 0) {
G = G / divisor;
}
}
if (G <= X) {
cout << "Yes\n" ;
for ( int i = 0; i < N; i++)
cout << arr[i] / copy_G << " " ;
cout << endl;
}
else
cout << "No" ;
}
int main()
{
int arr[] = { 6, 15, 6 }, X = 6;
int N = sizeof (arr) / sizeof (arr[0]);
checkCommonDivisor(arr, N, X);
}
|
Java
class GFG{
static void checkCommonDivisor( int [] arr,
int N, int X)
{
int G = 0 ;
for ( int i = 0 ; i < N; i++)
{
G = gcd(G, arr[i]);
}
int copy_G = G;
for ( int divisor = 2 ;
divisor <= X;
divisor++)
{
while (G % divisor == 0 )
{
G = G / divisor;
}
}
if (G <= X)
{
System.out.println( "Yes" );
for ( int i = 0 ; i < N; i++)
System.out.print((arr[i] / copy_G) + " " );
System.out.println();
}
else
System.out.println( "No" );
}
static int gcd( int a, int b)
{
if (b == 0 )
return a;
return gcd(b, a % b);
}
public static void main(String[] args)
{
int [] arr = { 6 , 15 , 6 };
int X = 6 ;
int N = arr.length;
checkCommonDivisor(arr, N, X);
}
}
|
Python3
import math
def checkCommonDivisor(arr, N, X):
G = 0
for i in range (N):
G = math.gcd(G, arr[i])
copy_G = G
for divisor in range ( 2 , X + 1 ):
while (G % divisor = = 0 ):
G = G / / divisor
if (G < = X):
print ( "Yes" )
for i in range (N):
print (arr[i] / / copy_G, end = " " )
print ()
else :
print ( "No" )
if __name__ = = "__main__" :
arr = [ 6 , 15 , 6 ]
X = 6
N = len (arr)
checkCommonDivisor(arr, N, X)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int GCD( int a, int b)
{
return b == 0 ? a : GCD(b, a % b);
}
static void checkCommonDivisor( int []arr,
int N, int X)
{
int G = 0;
for ( int i = 0; i < N; i++)
{
G = GCD(G, arr[i]);
}
int copy_G = G;
for ( int divisor = 2;
divisor <= X;
divisor++)
{
while (G % divisor == 0)
{
G = G / divisor;
}
}
if (G <= X)
{
Console.WriteLine( "Yes" );
for ( int i = 0; i < N; i++)
Console.Write(arr[i] / copy_G + " " );
Console.Write( "\n" );
}
else
Console.WriteLine( "No" );
}
public static void Main()
{
int []arr = { 6, 15, 6 };
int X = 6;
int N = arr.Length;
checkCommonDivisor(arr, N, X);
}
}
|
Javascript
<script>
function checkCommonDivisor(arr , N , X) {
var G = 0;
for (i = 0; i < N; i++) {
G = gcd(G, arr[i]);
}
var copy_G = G;
for (divisor = 2; divisor <= X; divisor++) {
while (G % divisor == 0) {
G = G / divisor;
}
}
if (G <= X) {
document.write( "Yes<br/>" );
for (i = 0; i < N; i++)
document.write((arr[i] / copy_G) + " " );
document.write();
}
else
document.write( "No" );
}
function gcd(a , b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
var arr = [ 6, 15, 6 ];
var X = 6;
var N = arr.length;
checkCommonDivisor(arr, N, X);
</script>
|
Time Complexity: O(N * logN)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...