Number of unmarked integers in a special sieve
Last Updated :
16 Oct, 2022
Given an array A containing numbers from 2 to N.. A special type of sieving is done on it .
The procedure of sieving is as follows:
- Create an array with elements as consecutive integers from 2 to N and mark every element in the array as unmarked.
- Let an integer Q = N and mark all the proper divisors of Q except Q itself in the array.
- Find the largest number unmarked less than Q and assign Q to it, and repeat from step 2. If there are no more unmarked elements then stop.
Find the number of unmarked integers after sieving.
Examples:
Input : N = 5
Output : Number of unmarked elements = 3
Explanation : We create array A[] = { 2, 3, 4, 5 }.
2 is marked as it is a proper divisor of 4.
Input : N = 4
Output : Number of unmarked elements = 2
Naive Approach:
One basic approach is to run two loops. Outer loop to traverse the whole array and inner loop for traversing from 2 – Q to unmark all the proper divisors of Q by checking a[i] % Q = 0.
Time Complexity: O(N^2)
Efficient Approach: A simple observation suggests that actually there is no need to do sieving here instead, the value of N will determine the answer.
- Case 1: If N is Odd then number of unmarked elements will be (N/2) + 1.
- Case 2: If N is Even then number of unmarked elements will be (N/2).
Time Complexity: O(1)
Examples:
Input : N = 5
Output : 3
A[] = { 2, 3, 4, 5 }
Steps:
- Q = 5 : Mark All the proper divisors of Q, here no element is there so every element remains unmarked.
- Q = 4 : Mark all the proper divisors of Q. Here 2 gets marked and unmarked elements are {3, 4, 5}.
- Q = 3 :
- Now no further marking can be done so stop here
So number of unmarked elements are 3 i.e {3, 4, 5}
In case of ODD value of N result should be (N/2)+1 = (3/2)+1 = (5/2)+1 = 2+1= 3.
Input : N = 4
Output : 2
A[] = { 2, 3, 4 }
Steps:
- Q = 4 Mark all the proper divisors of Q. So here 2 gets marked and unmarked elements are {3, 4}
- Q = 3
- Now no further marking can be done so stop here
So number of unmarked element after sieving are {3, 4} = 2
In case of EVEN value of N result should be (N/2) = (4/2) = 2
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
int countUnmarked( int N)
{
if (N % 2 == 0)
return N/2;
else
return N/2 + 1;
}
int main()
{
int N = 4;
cout << "Number of unmarked elements: "
<< countUnmarked(N) << endl;
return 0;
}
|
Java
import java.io.*;
class GFG
{
static int countUnmarked( int N)
{
if (N % 2 == 0 )
return N / 2 ;
else
return N / 2 + 1 ;
}
public static void main (String[] args)
{
int N = 4 ;
System.out.println( "Number of unmarked " +
"elements: " +
countUnmarked(N));
}
}
|
Python3
def countUnmarked(N):
if (N % 2 = = 0 ):
return N / 2 ;
else :
return N / 2 + 1 ;
N = 4 ;
print ( "Number of unmarked elements:" ,
int (countUnmarked(N)));
|
C#
using System;
class GFG
{
static int countUnmarked( int N)
{
if (N % 2 == 0)
return N / 2;
else
return N / 2 + 1;
}
public static void Main ()
{
int N = 4;
Console.WriteLine( "Number of unmarked " +
"elements: " +
countUnmarked(N));
}
}
|
PHP
<?php
function countUnmarked( $N )
{
if ( $N % 2 == 0)
return $N / 2;
else
return $N / 2 + 1;
}
$N = 4;
echo "Number of unmarked elements: " ,
countUnmarked( $N );
?>
|
Javascript
<script>
function countUnmarked(N) {
if (N % 2 == 0)
return N / 2;
else
return N / 2 + 1;
}
var N = 4;
document.write( "Number of unmarked "
+ "elements: " + countUnmarked(N));
</script>
|
Output
Number of unmarked elements: 2
Time complexity: O(1)
Auxiliary space: O(1)
Share your thoughts in the comments
Please Login to comment...