Given an array arr[] consisting of N positive integers, the task is to find an integer greater than 1 which is coprime with all the given array elements.
Examples:
Input: arr[ ] = {10,13,17,19}
Output: 23
Explanation:
The GCD of 23 with every array element is 1. Therefore, 23 is coprime with all the given array elements.
Input: arr[] = {13, 17, 23, 24, 50}
Output: 53
Explanation:
The GCD of 53 with every array element is 1. Therefore, 53 is coprime with all the given array elements.
Approach: The idea is to use the fact that a prime number greater than the maximum array element will be coprime with all the given array elements. Therefore, simply find the prime number greater than the largest element present in the array.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int find_X( int arr[], int N)
{
int R = INT_MIN;
for ( int i = 0; i < N; i++)
R = max(R, arr[i]);
bool prime[1000001];
for ( int i = 0; i < 1000001; i++)
prime[i] = true ;
int p = 2;
while (p * p <= 1000002)
{
if (prime[p] == true )
{
for ( int i = p * 2; i < 1000001; i += p)
{
prime[i] = false ;
}
}
p = p + 1;
}
prime[0] = false ;
prime[1] = false ;
for ( int i = R; i < 1000001; i++) {
if (i > R and prime[i] == true ) {
return i;
}
}
return -1;
}
int main()
{
int arr[] = { 10, 13, 17, 19 };
int N = sizeof (arr) / sizeof (arr[0]);
cout << find_X(arr, N);
return 0;
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class GFG {
static int find_X( int arr[])
{
int R = Integer.MIN_VALUE;
for ( int i = 0 ; i < arr.length; i++)
R = Math.max(R, arr[i]);
boolean prime[] = new boolean [ 1000001 ];
Arrays.fill(prime, true );
int p = 2 ;
while (p * p <= 1000002 ) {
if (prime[p] == true ) {
for ( int i = p * 2 ; i < 1000001 ; i += p) {
prime[i] = false ;
}
}
p = p + 1 ;
}
prime[ 0 ] = false ;
prime[ 1 ] = false ;
for ( int i = R; i < 1000001 ; i++) {
if (i > R && prime[i] == true ) {
return i;
}
}
return - 1 ;
}
public static void main(String[] args)
{
int arr[] = { 10 , 13 , 17 , 19 };
System.out.println(find_X(arr));
}
}
|
Python3
import math
def find_X(arr):
R = max (arr)
prime = [ True for i in range ( 0 , 1000001 )]
p = 2
while (p * p < = 1000002 ):
if (prime[p] = = True ):
for i in range (p * 2 , 1000001 , p):
prime[i] = False
p = p + 1
prime[ 0 ] = False
prime[ 1 ] = False
for i in range (R, 1000001 ):
if i > R and prime[i] = = True :
return i
arr = [ 10 , 13 , 17 , 19 ]
print (find_X(arr))
|
C#
using System;
class GFG{
static int find_X( int [] arr)
{
int R = Int32.MinValue;
for ( int i = 0; i < arr.Length; i++)
R = Math.Max(R, arr[i]);
bool [] prime = new bool [1000001];
for ( int i = 0; i < 1000001; i++)
{
prime[i] = true ;
}
int p = 2;
while (p * p <= 1000002)
{
if (prime[p] == true )
{
for ( int i = p * 2; i < 1000001; i += p)
{
prime[i] = false ;
}
}
p = p + 1;
}
prime[0] = false ;
prime[1] = false ;
for ( int i = R; i < 1000001; i++)
{
if (i > R && prime[i] == true )
{
return i;
}
}
return -1;
}
public static void Main(String []args)
{
int [] arr = { 10, 13, 17, 19 };
Console.WriteLine(find_X(arr));
}
}
|
Javascript
<script>
function find_X(arr)
{
let R = Number.MIN_VALUE;
for (let i = 0; i < arr.length; i++)
R = Math.max(R, arr[i]);
let prime = Array(1000001).fill( true );
let p = 2;
while (p * p <= 1000002)
{
if (prime[p] == true )
{
for (let i = p * 2; i < 1000001; i += p)
{
prime[i] = false ;
}
}
p = p + 1;
}
prime[0] = false ;
prime[1] = false ;
for (let i = R; i < 1000001; i++)
{
if (i > R && prime[i] == true )
{
return i;
}
}
return -1;
}
let arr = [ 10, 13, 17, 19 ];
document.write(find_X(arr));
</script>
|
Time Complexity: O(N*log(N))
Auxiliary Space: O(N)