Given an array of N elements, find the minimum number of insertions to convert the given array into a co-prime array. Print the resultant array also.
Co-prime Array : An array in which every pair of adjacent elements are co-primes. i.e,
Examples :
Input : A[] = {2, 7, 28}
Output : 1
Explanation :
Here, 1st pair = {2, 7} are co-primes( gcd(2, 7) = 1).
2nd pair = {7, 28} are not co-primes, insert 9
between them. gcd(7, 9) = 1 and gcd(9, 28) = 1.Input : A[] = {5, 10, 20}
Output : 2
Explanation :
Here, there is no pair which are co-primes.
Insert 7 between (5, 10) and 1 between (10, 20).
Observe that to make a pair to become co-primes we have to insert a number which makes the newly formed pairs co-primes. So, we have to check every adjacent pair for their co-primality and insert a number if required. Now, what is the number that should be inserted? Let us take two numbers a and b. If any of a or b is 1, then GCD(a, b) = 1. So, we can insert ONE(1) at every pair. For efficiency we use euler’s gcd function .
Below is the implementation of the above approach:
// CPP program for minimum insertions to // make a Co-prime Array. #include <bits/stdc++.h> using namespace std;
void printResult( int arr[], int n)
{ // Counting adjacent pairs that are not
// co-prime.
int count = 0;
for ( int i = 1; i < n; i++)
if (__gcd(arr[i], arr[i - 1]) != 1)
count++;
cout << count << endl; // No.of insertions
cout << arr[0] << " " ;
for ( int i = 1; i < n; i++)
{
// If pair is not a co-prime insert 1.
if (__gcd(arr[i], arr[i - 1]) != 1)
cout << 1 << " " ;
cout << arr[i] << " " ;
}
} // Driver Function int main()
{ int A[] = { 5, 10, 20 };
int n = sizeof (A) / sizeof (A[0]);
printResult(A, n);
return 0;
} |
//Java program for minimum insertions // to make a Co-prime 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 || b == 0 )
return 0 ;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return gcd(a-b, b);
return gcd(a, b-a);
}
static void printResult( int arr[], int n)
{
// Counting adjacent pairs that are not
// co-prime.
int count = 0 ;
for ( int i = 1 ; i < n; i++)
if (gcd(arr[i], arr[i - 1 ]) != 1 )
count++;
// No.of insertions
System.out.println(count );
System.out.print (arr[ 0 ] + " " );
for ( int i = 1 ; i < n; i++)
{
// If pair is not a co-prime insert 1.
if (gcd(arr[i], arr[i - 1 ]) != 1 )
System.out.print( 1 + " " );
System.out.print(arr[i] + " " );
}
}
// Driver Function
public static void main(String args[])
{
int A[] = { 5 , 10 , 20 };
int n = A.length;
printResult(A, n);
}
} /*This code is contributed by Nikita Tiwari.*/ |
# Python3 code for minimum insertions # to make a Co-prime Array. from fractions import gcd
def printResult(arr, n):
# Counting adjacent pairs that
# are not co-prime.
count = 0
for i in range ( 1 ,n):
if (gcd(arr[i], arr[i - 1 ]) ! = 1 ):
count + = 1
print (count) # No.of insertions
print ( arr[ 0 ], end = " " )
for i in range ( 1 ,n):
# If pair is not a co-prime insert 1.
if (gcd(arr[i], arr[i - 1 ]) ! = 1 ):
print ( 1 , end = " " )
print (arr[i] , end = " " )
# Driver Code A = [ 5 , 10 , 20 ]
n = len (A)
printResult(A, n) # This code is contributed by "Sharad_Bhardwaj". |
// C# program for minimum insertions // to make a Co-prime 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 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return gcd(a - b, b);
return gcd(a, b - a);
}
static void printResult( int [] arr, int n)
{
// Counting adjacent pairs that
// are not co-prime.
int count = 0;
for ( int i = 1; i < n; i++)
if (gcd(arr[i], arr[i - 1]) != 1)
count++;
// No.of insertions
Console.WriteLine(count);
Console.Write(arr[0] + " " );
for ( int i = 1; i < n; i++) {
// If pair is not a co-prime insert 1.
if (gcd(arr[i], arr[i - 1]) != 1)
Console.Write(1 + " " );
Console.Write(arr[i] + " " );
}
}
// Driver Function
public static void Main()
{
int [] A = { 5, 10, 20 };
int n = A.Length;
printResult(A, n);
}
} /*This code is contributed by vt_m.*/ |
<?php // PHP program for minimum // insertions to make a // Co-prime Array. // Recursive function to // return gcd of a and b function gcd( $a , $b )
{ // Everything divides 0
if ( $a == 0 || $b == 0)
return 0;
// base case
if ( $a == $b )
return $a ;
// a is greater
if ( $a > $b )
return gcd( $a - $b , $b );
return gcd( $a , $b - $a );
} function printResult( $arr , $n )
{ // Counting adjacent pairs
// that are not co-prime.
$count = 0;
for ( $i = 1; $i < $n ; $i ++)
if (gcd( $arr [ $i ],
$arr [ $i - 1]) != 1)
$count ++;
// No.of insertions
echo $count , "\n" ;
echo $arr [0] , " " ;
for ( $i = 1; $i < $n ; $i ++)
{
// If pair is not a
// co-prime insert 1.
if (gcd( $arr [ $i ],
$arr [ $i - 1]) != 1)
echo 1 , " " ;
echo $arr [ $i ] , " " ;
}
} // Driver Code $A = array (5, 10, 20);
$n = sizeof( $A );
printResult( $A , $n );
// This code is contributed // by ajit ?> |
<script> // Javascript program for minimum insertions // to make a Co-prime Array. // Recursive function to return // gcd of a and b function gcd(a, b)
{ // Everything divides 0
if (a == 0 || b == 0)
return 0;
// base case
if (a == b)
return a;
// a is greater
if (a > b)
return gcd(a - b, b);
return gcd(a, b - a);
} function printResult(arr, n)
{ // Counting adjacent pairs that
// are not co-prime.
let count = 0;
for (let i = 1; i < n; i++)
if (gcd(arr[i], arr[i - 1]) != 1)
count++;
// No.of insertions
document.write(count + "</br>" );
document.write(arr[0] + " " );
for (let i = 1; i < n; i++)
{
// If pair is not a co-prime insert 1.
if (gcd(arr[i], arr[i - 1]) != 1)
document.write(1 + " " );
document.write(arr[i] + " " );
}
} // Driver code let A = [ 5, 10, 20 ]; let n = A.length; printResult(A, n); // This code is contributed by suresh07 </script> |
Output
2 5 1 10 1 20
Time Complexity: O(n log(Ai)), for using __gcd function
Auxiliary Space: O(1)