Given a sequence Y of size N where:
Yi = gcd(X1, X2, X3, . . ., Xi ) of some sequence X.
The task is to find such a sequence X if any such X is possible.
Note: If X exists there can be multiple value possible for X. Generating any one is sufficient.
Examples:
Input: N = 2, Y = [4, 2]
Output: [4, 2]
Explanation: Y0 = gcd(X0) = X0 = 4. And gcd(4, 2) = 2 = Y1.Input: [1, 3]
Output: -1
Explanation: No such sequence can be formed.
Approach: The problem can be solved based on the following observation:
- ith element of Y = gcd(X1, X2, X3, . . ., Xi ) and (i+1)th element of Y = gcd(X1, X2, X3, . . ., Xi, Xi+1).
- So (i+1)th element of Y can be written as gcd(gcd(X1, X2, X3, . . ., Xi ), Xi+1) ——-(1) i.e, gcd(a, b, c) = gcd( gcd(a, b), c ).
- So (i+1)th element of Y is gcd( ith element of Y, X(i+1)) from equation 1.
- Therefore (i+1)th element of Y must be factor of ith element of Y, as gcd of two elements is divisor of both the elements.
- Since (i+1)th element of Y divides ith element of Y, gcd( ith element, (i+1)th element) is always equals to (i+1)th element.
Follow the illustration below:
Illustration:
For example: N = 2, Y = {4, 2}
- X[0] = Y[0] = 4 because any number is GCD of itself.
- Y[1] = GCD(X[0], X[1]). Now GCD(X[0]) = Y[0]. So Y[1] = GCD(Y[0], X[1]). Therefore Y[1] should be a factor of Y[0].
- In the given example 2 is a factor of 4. So forming a sequence X is possible and X[1] can be same as Y[1].
Assigning X[1] = 2 satisfies GCD (X[0, X[1]) = Y[1] = 2.- So the final sequence X is {4, 2}.
So follow the steps mentioned below to solve the problem based on the above observation:
- Start traversing Y from the starting of the sequence.
- If in the given Sequence Y has any (i+1)th element which does not divide ith element then sequence X can’t be generated.
- If the (i+1)th element divides ith element then there exists a sequence X and it can be found by above conclusion of(i+1)th element of Y
is gcd( ith element of Y, Xi+1) and Xi+1 = Yi+1 is a possible value for Xi+1.
Below is the implementation of the approach:
// C++ Program to implement above approach #include <bits/stdc++.h> using namespace std;
// Euclidean theorem to find gcd int gcd( int a, int b)
{ if (b == 0)
return a;
return gcd(b, a % b);
} // Function to check if it is possible // to generate lost sequence X void checkforX( int Y[], int N)
{ int cur_gcd = Y[0];
bool Xexist = true ;
// Loop to check existence of X
for ( int i = 1; i < N; i++) {
cur_gcd = gcd(cur_gcd, Y[i]);
if (cur_gcd != Y[i]) {
Xexist = false ;
break ;
}
}
// Sequence X is found
if (Xexist) {
// Loop to generate X
for ( int i = 0; i < N; i++)
cout << Y[i] << ' ' ;
}
// Sequence X can't be generated
else {
cout << -1 << endl;
}
} // Driver code int main()
{ int N = 2;
// Sequence Y of size 2
int Y[] = { 4, 2 };
checkforX(Y, N);
return 0;
} |
// C program to implement above approach #include <stdio.h> // Euclidean theorem to calculate gcd int gcd( int a, int b)
{ if (b == 0)
return a;
return gcd(b, a % b);
} // Function to check if it is possible // to generate lost sequence X void checkforX( int Y[], int N)
{ int cur_gcd = Y[0];
int Xexist = 1;
// Loop to check existence of X
for ( int i = 1; i < N; i++) {
cur_gcd = gcd(cur_gcd, Y[i]);
if (cur_gcd != Y[i]) {
Xexist = 0;
break ;
}
}
// Sequence X is found
if (Xexist) {
// Loop to generate X
for ( int i = 0; i < N; i++)
printf ( "%d " , Y[i]);
}
// Sequence X can't be generated
else {
printf ( "-1" );
}
} // Driver code int main()
{ int N = 2;
// Sequence Y of size 2
int Y[] = { 4, 2 };
checkforX(Y, N);
return 0;
} |
// Java Program to implement above approach import java.util.*;
class GFG{
// Euclidean theorem to find gcd static int gcd( int a, int b)
{ if (b == 0 )
return a;
return gcd(b, a % b);
} // Function to check if it is possible // to generate lost sequence X static void checkforX( int Y[], int N)
{ int cur_gcd = Y[ 0 ];
boolean Xexist = true ;
// Loop to check existence of X
for ( int i = 1 ; i < N; i++) {
cur_gcd = gcd(cur_gcd, Y[i]);
if (cur_gcd != Y[i]) {
Xexist = false ;
break ;
}
}
// Sequence X is found
if (Xexist) {
// Loop to generate X
for ( int i = 0 ; i < N; i++)
System.out.print(Y[i] + " " );
}
// Sequence X can't be generated
else {
System.out.print(- 1 + "\n" );
}
} // Driver code public static void main(String[] args)
{ int N = 2 ;
// Sequence Y of size 2
int Y[] = { 4 , 2 };
checkforX(Y, N);
} } // This code is contributed by 29AjayKumar |
# Python code for the above approach # Euclidean theorem to find gcd def gcd(a, b):
if (b = = 0 ):
return a
return gcd(b, a % b)
# Function to check if it is possible # to generate lost sequence X def checkforX(Y, N):
cur_gcd = Y[ 0 ]
Xexist = True
# Loop to check existence of X
for i in range ( 1 , N):
cur_gcd = gcd(cur_gcd, Y[i])
if (cur_gcd ! = Y[i]):
Xexist = False
break
# Sequence X is found
if (Xexist):
# Loop to generate X
for i in range (N):
print (Y[i], end = ' ' )
# Sequence X can't be generated
else :
print ( - 1 )
# Driver code N = 2
# Sequence Y of size 2 Y = [ 4 , 2 ]
checkforX(Y, N) # This code is contributed by gfgking |
// C# Program to implement above approach using System;
class GFG
{ // Euclidean theorem to find gcd static int gcd( int a, int b)
{ if (b == 0)
return a;
return gcd(b, a % b);
} // Function to check if it is possible // to generate lost sequence X static void checkforX( int []Y, int N)
{ int cur_gcd = Y[0];
bool Xexist = true ;
// Loop to check existence of X
for ( int i = 1; i < N; i++) {
cur_gcd = gcd(cur_gcd, Y[i]);
if (cur_gcd != Y[i]) {
Xexist = false ;
break ;
}
}
// Sequence X is found
if (Xexist) {
// Loop to generate X
for ( int i = 0; i < N; i++)
Console.Write(Y[i] + " " );
}
// Sequence X can't be generated
else {
Console.Write(-1);
}
} // Driver code public static void Main()
{ int N = 2;
// Sequence Y of size 2
int []Y = { 4, 2 };
checkforX(Y, N);
} } // This code is contributed by Samim Hossain Mondal. |
<script> // JavaScript code for the above approach
// Euclidean theorem to find gcd
function gcd(a, b) {
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to check if it is possible
// to generate lost sequence X
function checkforX(Y, N) {
let cur_gcd = Y[0];
let Xexist = true ;
// Loop to check existence of X
for (let i = 1; i < N; i++) {
cur_gcd = gcd(cur_gcd, Y[i]);
if (cur_gcd != Y[i]) {
Xexist = false ;
break ;
}
}
// Sequence X is found
if (Xexist) {
// Loop to generate X
for (let i = 0; i < N; i++)
document.write(Y[i] + ' ' );
}
// Sequence X can't be generated
else {
document.write(-1 + '<br>');
}
}
// Driver code
let N = 2;
// Sequence Y of size 2
let Y = [4, 2];
checkforX(Y, N);
// This code is contributed by Potta Lokesh
</script>
|
4 2
Time Complexity: O(N)
Auxiliary space: O(1)