Generate Array of distinct elements with GCD as 1 and no Coprime pair
Last Updated :
09 May, 2022
Given an integer N, the task is to generate an array of N distinct integers. Such that the GCD of all the elements of the array is 1, but no pair of elements is co-prime i.e., for any pair (A[i], A[j]) of array GCD(A[i], A[j]) ≠1.
Note: If more than 1 answers are possible, print any of them.
Examples:
Input: N = 4
Output: 30 70 42 105
Explanation: GCD(30, 70, 42, 105) = 1.
GCD(30, 70) = 10, GCD(30, 42) = 6, GCD(30, 105) = 15, GCD(70, 42) = 14, GCD(70, 105) = 35, GCD(42, 105) = 21.
Hence, it can be seen that GCD of all elements is 1, whereas GCD of all possible pairs is greater than 1.
Input: N = 6
Output: 10 15 6 12 24 48
Approach: The problem can be solved based on the following observation:
Suppose A1, A2, A3 . . . AN are N prime numbers. Let their product be P, i.e. P = A1 * A2 * A3 . . .*AN.
Then, the sequence P/A1 , P/A2 . . . P/AN = (A2 * A3 . . . AN), (A1 * A3 . . . AN), . . ., (A1 * A2 . . . AN-1)
This sequence have at least one common factor between any pair of elements but the overall GCD is 1
This can be done following the steps given below:
- If N = 2, return -1, as no such sequence is possible for N = 2.
- Store the first N primes using the Sieve of Eratosthenes (say in a vector v).
- Calculate the product of all elements of vector “v” and store it in a variable (say “product”).
- Now, iterate from i = 0 to N-1 and at each iteration store the ith element of answer as (product/v[i]).
- Return the resultant vector.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
const int M = 100001;
bool primes[M + 1];
void printArray( int N)
{
if (N == 2) {
cout << -1 << endl;
return ;
}
for ( int i = 0; i < M; i++)
primes[i] = 1;
primes[0] = 0;
primes[1] = 0;
for ( int i = 2; i * i <= M; i++) {
if (primes[i] == 1) {
for ( int j = i * i; j <= M;
j += i) {
primes[j] = 0;
}
}
}
vector< int > v;
for ( int i = 0; i < M; i++) {
if (v.size() < N
&& primes[i] == 1) {
v.push_back(i);
}
}
int product = 1;
vector< int > answer;
for ( auto it : v) {
product *= it;
}
for ( int i = 0; i < N; i++) {
int num = product / v[i];
answer.push_back(num);
}
for ( int i = 0; i < N; i++) {
cout << answer[i] << " " ;
}
}
int32_t main()
{
int N = 4;
printArray(N);
return 0;
}
|
Java
import java.util.ArrayList;
class GFG {
static int M = 100001 ;
static int [] primes = new int [M + 1 ];
static void printArray( int N)
{
if (N == 2 ) {
System.out.println(- 1 );
return ;
}
for ( int i = 0 ; i < M; i++)
primes[i] = 1 ;
primes[ 0 ] = 0 ;
primes[ 1 ] = 0 ;
for ( int i = 2 ; i * i <= M; i++) {
if (primes[i] == 1 ) {
for ( int j = i * i; j <= M; j += i) {
primes[j] = 0 ;
}
}
}
ArrayList<Integer> v = new ArrayList<Integer>();
for ( int i = 0 ; i < M; i++) {
if (v.size() < N && primes[i] == 1 ) {
v.add(i);
}
}
int product = 1 ;
ArrayList<Integer> answer
= new ArrayList<Integer>();
;
for ( int i = 0 ; i < v.size(); i++) {
product *= v.get(i);
}
for ( int i = 0 ; i < N; i++) {
int num = product / v.get(i);
answer.add(num);
}
for ( int i = 0 ; i < N; i++) {
System.out.print(answer.get(i) + " " );
}
}
public static void main(String[] args)
{
int N = 4 ;
printArray(N);
}
}
|
Python3
M = 100001
primes = [ 0 ] * (M + 1 )
def printArrayint(N):
if N = = 2 :
print ( - 1 )
return
for i in range (M):
primes[i] = 1
primes[ 0 ] = 0
primes[ 1 ] = 0
i = 2
while i * i < = M:
if primes[i] = = 1 :
j = i * i
while j < = M:
primes[j] = 0
j + = i
i + = 1
v = []
for i in range (M):
if len (v) < N and primes[i] = = 1 :
v.append(i)
product = 1
answer = []
for it in v:
product * = it
for i in range (N):
num = product / / v[i]
answer.append(num)
for i in range (N):
print (answer[i], end = " " )
if __name__ = = "__main__" :
N = 4
printArrayint(N)
|
C#
using System;
using System.Collections;
class GFG {
static int M = 100001;
static int [] primes = new int [M + 1];
static void printArray( int N)
{
if (N == 2) {
Console.WriteLine(-1);
return ;
}
for ( int i = 0; i < M; i++)
primes[i] = 1;
primes[0] = 0;
primes[1] = 0;
for ( int i = 2; i * i <= M; i++) {
if (primes[i] == 1) {
for ( int j = i * i; j <= M; j += i) {
primes[j] = 0;
}
}
}
ArrayList v = new ArrayList();
for ( int i = 0; i < M; i++) {
if (v.Count < N && primes[i] == 1) {
v.Add(i);
}
}
int product = 1;
ArrayList answer = new ArrayList();
foreach ( int it in v) { product *= ( int )it; }
for ( int i = 0; i < N; i++) {
int num = product / ( int )v[i];
answer.Add(num);
}
for ( int i = 0; i < N; i++) {
Console.Write(answer[i] + " " );
}
}
public static void Main()
{
int N = 4;
printArray(N);
}
}
|
Javascript
<script>
let M = 100001;
let primes = new Array(M + 1);
function printArray(N)
{
if (N == 2) {
document.write(-1 + "<br>" )
return ;
}
for (let i = 0; i < M; i++)
primes[i] = 1;
primes[0] = 0;
primes[1] = 0;
for (let i = 2; i * i <= M; i++) {
if (primes[i] == 1) {
for (let j = i * i; j <= M;
j += i) {
primes[j] = 0;
}
}
}
let v = [];
for (let i = 0; i < M; i++) {
if (v.length < N
&& primes[i] == 1) {
v.push(i);
}
}
let product = 1;
let answer = [];
for (let it of v) {
product *= it;
}
for (let i = 0; i < N; i++) {
let num = Math.floor(product / v[i]);
answer.push(num);
}
for (let i = 0; i < N; i++) {
document.write(answer[i] + " " )
}
}
let N = 4;
printArray(N);
</script>
|
Time Complexity : O(M*(log(logM))) where M is a large positive number [here, 100000]
Auxiliary Space : O(M)
Better Approach: The above approach will fail for larger values of N, as the product of more than 15 primes can not be stored. This can be avoided based on the following observation:
Fix the first three distinct numbers with all possible products formed taking two among first three primes (say the numbers formed are X, Y and Z).
Then for the next elements keep on multiplying any one (say X) by one of the primes (say it becomes X’) and changing X to X’.
As the GCD of X, Y and Z is 1 the overall GCD will be one but no two elements will be coprime to each other.
For own convenience use the first 3 primes 2, 3, 5 and make the first 3 numbers as 10, 15, 6, and the others by multiplying with 2 i.e. 12, 24, 48, . . .
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long
void printArray( int N)
{
if (N == 1) {
cout << 2 << endl;
}
if (N == 2) {
cout << -1 << endl;
return ;
}
int ans[N];
ans[0] = 10, ans[1] = 15, ans[2] = 6;
for ( int i = 3; i < N; i++) {
ans[i] = 2LL * ans[i - 1];
}
for ( int i = 0; i < N; i++) {
cout << ans[i] << " " ;
}
}
int32_t main()
{
int N = 4;
printArray(N);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static void printArray( int N)
{
if (N == 1 ) {
System.out.println( 2 );
}
if (N == 2 ) {
System.out.println(- 1 );
return ;
}
int ans[] = new int [N];
ans[ 0 ] = 10 ;
ans[ 1 ] = 15 ;
ans[ 2 ] = 6 ;
for ( int i = 3 ; i < N; i++) {
ans[i] = 2 * ans[i - 1 ];
}
for ( int i = 0 ; i < N; i++) {
System.out.print(ans[i] + " " );
}
}
public static void main(String[] args)
{
int N = 4 ;
printArray(N);
}
}
|
Python3
def printArray(N):
if (N = = 1 ):
print ( 2 )
if (N = = 2 ):
print ( - 1 )
return
ans = [ 0 ] * N
ans[ 0 ] = 10
ans[ 1 ] = 15
ans[ 2 ] = 6
for i in range ( 3 , N):
ans[i] = 2 * ans[i - 1 ]
for i in range (N):
print (ans[i], end = " " )
if __name__ = = '__main__' :
N = 4
printArray(N)
|
C#
using System;
class GFG
{
public static void printArray( int N)
{
if (N == 1) {
Console.Write(2);
}
if (N == 2) {
Console.Write(-1);
return ;
}
int [] ans = new int [N];
ans[0] = 10;
ans[1] = 15;
ans[2] = 6;
for ( int i = 3; i < N; i++) {
ans[i] = 2 * ans[i - 1];
}
for ( int i = 0; i < N; i++) {
Console.Write(ans[i] + " " );
}
}
public static void Main()
{
int N = 4;
printArray(N);
}
}
|
Javascript
<script>
function printArray( N)
{
if (N == 1) {
document.write(2);
}
if (N == 2) {
document.write(-1);
return ;
}
let ans = new Array(N);
ans[0] = 10;
ans[1] = 15;
ans[2] = 6;
for (let i = 3; i < N; i++) {
ans[i] = 2 * ans[i - 1];
}
for (let i = 0; i < N; i++) {
document.write(ans[i] + " " );
}
}
let N = 4;
printArray(N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...