Number of unmarked integers in a special sieve

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:

  1. Create an array with elements as consecutive integers from 2 to N and mark every element in the array as unmarked.
  2. Let an integer Q = N and mark all the proper divisors of Q except Q itself in the array.
  3. 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:
1.) Q = 5 : Mark All the proper divisors of Q, here no element is there so every element remains unmarked.
3.) Q = 4 : Mark all the proper divisors of Q. Here 2 gets marked and unmarked elements are {3, 4, 5}.
5.) Q = 3 :
6.) 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:
1.) Q = 4 Mark all the proper divisors of Q. So here 2 gets marked and unmarked elements are {3, 4}
3.) Q = 3
4.) 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

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to determine the 
// number of unmarked integers in 
// a special sieve
#include <bits/stdc++.h>
using namespace std;
  
int countUnmarked(int N)
{
    if (N % 2 == 0)
       return N/2;
    else
       return N/2 + 1;
}
  
// Driver Code
int main()
{
    int N = 4;
    cout << "Number of unmarked elements: " 
         << countUnmarked(N) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to determine 
// the number of unmarked 
// integers in a special sieve
import java.io.*;
  
class GFG
{
static int countUnmarked(int N)
{
    if (N % 2 == 0)
    return N / 2;
    else
    return N / 2 + 1;
}
  
// Driver Code
public static void main (String[] args) 
{
    int N = 4;
    System.out.println("Number of unmarked "
                                "elements: "
                            countUnmarked(N));
}
}
  
// This code is contributed
// by anuj_67.

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 Program to determine 
# the number of unmarked 
# integers in a special sieve
def countUnmarked(N):
    if (N % 2 == 0):
        return N / 2;
    else:
        return N / 2 + 1;
  
# Driver Code
N = 4;
print("Number of unmarked elements:"
              int(countUnmarked(N)));
      
# This code is contributed
# by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to determine 
// the number of unmarked 
// integers in a special sieve
using System;
  
class GFG
{
static int countUnmarked(int N)
{
    if (N % 2 == 0)
        return N / 2;
    else
        return N / 2 + 1;
}
  
// Driver Code
public static void Main () 
{
    int N = 4;
    Console.WriteLine("Number of unmarked "
                               "elements: "
                           countUnmarked(N));
}
}
  
// This code is contributed
// by anuj_67.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP Program to determine 
// the number of unmarked 
// integers in a special sieve
  
function countUnmarked($N)
{
    if ($N % 2 == 0)
    return $N / 2;
    else
    return $N / 2 + 1;
}
  
// Driver Code
$N = 4;
echo "Number of unmarked elements: ",
                   countUnmarked($N);
      
// This code is contributed
// by anuj_67.
?>

chevron_right


Output:

Number of unmarked elements: 2


My Personal Notes arrow_drop_up

Maths is the language of nature

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : vt_m, Mithun Kumar