Given an integer N, repeatedly choose two distinct integers from the range 2 to N and if their GCD is found to be greater than 1, insert them into the same set, as long as possible. The sets formed in Equivalence Relation. Therefore, if integers a and b are in the same set and integers b and c are in the same set, then integers a and c are also said to be in the same group. The task is to find the total number of such sets that can be formed.
Examples:
Input: N = 3
Output: 2
Explanation: Sets formed are: {2}, {3}. They cannot be put in the same set because there GCD is 1.Input: N = 9
Output : 3
Sets formed are : {2, 3, 4, 6, 8, 9}, {5}, {7}
As {2, 4, 6, 8} lies in same set and {3, 6, 9} also lies in same set. Hence, all these lie in one set together, because 6 is the common element in both the sets.
Approach: The idea to solve the problem is based on the following observation that all the numbers less than or equal to N/2 belong to the same set because if 2 is multiplied in them, they will be even number and has GCD greater than 1 with 2. So the remaining sets are formed by numbers greater than N/2 and are prime because if they are not prime then there is a number less than or equal to N/2 which is the divisor of that number. The prime numbers from 2 to N can be found using the Sieve of Eratosthenes.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> using namespace std;
bool prime[100001];
// Sieve of Eratosthenes to find // primes less than or equal to N void SieveOfEratosthenes( int n)
{ memset (prime, true , sizeof (prime));
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
} // Function to find number of Sets void NumberofSets( int N)
{ SieveOfEratosthenes(N);
// Handle Base Case
if (N == 2) {
cout << 1 << endl;
}
else if (N == 3) {
cout << 2 << endl;
}
else {
// Set which contains less
// than or equal to N/2
int ans = 1;
// Number greater than N/2 and
// are prime increment it by 1
for ( int i = N / 2 + 1; i <= N; i++) {
// If the number is prime
// Increment answer by 1
if (prime[i]) {
ans += 1;
}
}
cout << ans << endl;
}
} // Driver Code int main()
{ // Input
int N = 9;
// Function Call
NumberofSets(N);
return 0;
} |
// Java program for the above approach import java.util.*;
class GFG{
static boolean prime[] = new boolean [ 100001 ];
// Sieve of Eratosthenes to find // primes less than or equal to N static void SieveOfEratosthenes( int n)
{ Arrays.fill(prime, true );
for ( int p = 2 ; p * p <= n; p++)
{
if (prime[p] == true )
{
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
} // Function to find number of Sets static void NumberofSets( int N)
{ SieveOfEratosthenes(N);
// Handle Base Case
if (N == 2 )
{
System.out.print( 1 );
}
else if (N == 3 )
{
System.out.print( 2 );
}
else
{
// Set which contains less
// than or equal to N/2
int ans = 1 ;
// Number greater than N/2 and
// are prime increment it by 1
for ( int i = N / 2 + 1 ; i <= N; i++)
{
// If the number is prime
// Increment answer by 1
if (prime[i])
{
ans += 1 ;
}
}
System.out.print(ans);
}
} // Driver Code public static void main(String[] args)
{ // Input
int N = 9 ;
// Function Call
NumberofSets(N);
} } // This code is contributed by code_hunt |
# Python3 program for the above approach prime = [ True ] * 100001
# Sieve of Eratosthenes to find # primes less than or equal to N def SieveOfEratosthenes(n):
global prime
for p in range ( 2 , n + 1 ):
if p * p > n:
break
if (prime[p] = = True ):
for i in range (p * p, n + 1 , p):
prime[i] = False
# Function to find number of Sets def NumberofSets(N):
SieveOfEratosthenes(N)
# Handle Base Case
if (N = = 2 ):
print ( 1 )
elif (N = = 3 ):
print ( 2 )
else :
# Set which contains less
# than or equal to N/2
ans = 1
# Number greater than N/2 and
# are prime increment it by 1
for i in range (N / / 2 , N + 1 ):
# If the number is prime
# Increment answer by 1
if (prime[i]):
ans + = 1
print (ans)
# Driver Code if __name__ = = '__main__' :
# Input
N = 9
# Function Call
NumberofSets(N)
# This code is contributed by mohit kumar 29 |
// C# program for the above approach using System;
using System.Collections.Generic;
class GFG{
static bool []prime = new bool [100001];
// Sieve of Eratosthenes to find // primes less than or equal to N static void SieveOfEratosthenes( int n)
{ for ( int i=0;i<100001;i++)
prime[i] = true ;
for ( int p = 2; p * p <= n; p++) {
if (prime[p] == true ) {
for ( int i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
} // Function to find number of Sets static void NumberofSets( int N)
{ SieveOfEratosthenes(N);
// Handle Base Case
if (N == 2) {
Console.Write(1);
}
else if (N == 3) {
Console.Write(2);
}
else {
// Set which contains less
// than or equal to N/2
int ans = 1;
// Number greater than N/2 and
// are prime increment it by 1
for ( int i = N / 2 + 1; i <= N; i++) {
// If the number is prime
// Increment answer by 1
if (prime[i]) {
ans += 1;
}
}
Console.Write(ans);
}
} // Driver Code public static void Main()
{ // Input
int N = 9;
// Function Call
NumberofSets(N);
} } // This code is contributed by SURENDRA_GANGWAR. |
<script> // Javascript program for the above approach let prime = new Array(100001);
// Sieve of Eratosthenes to find // primes less than or equal to N function SieveOfEratosthenes(n)
{ for (let i=0;i<prime.length;i++)
{
prime[i]= true ;
}
for (let p = 2; p * p <= n; p++)
{
if (prime[p] == true )
{
for (let i = p * p; i <= n; i += p)
prime[i] = false ;
}
}
} // Function to find number of Sets function NumberofSets(N)
{ SieveOfEratosthenes(N);
// Handle Base Case
if (N == 2)
{
document.write(1);
}
else if (N == 3)
{
document.write(2);
}
else
{
// Set which contains less
// than or equal to N/2
let ans = 1;
// Number greater than N/2 and
// are prime increment it by 1
for (let i = Math.floor(N / 2) + 1; i <= N; i++)
{
// If the number is prime
// Increment answer by 1
if (prime[i])
{
ans += 1;
}
}
document.write(ans);
}
} // Driver Code // Input let N = 9; // Function Call NumberofSets(N); // This code is contributed by unknown2108 </script> |
3
Time Complexity: O(N)
Auxiliary Space: O(K)