Sum of numbers in a range [L, R] whose count of divisors is prime
Last Updated :
13 Mar, 2022
Given Q queries where each query consists of an integer range [L, R], the task is to find the sum of the integers from the given range whose count of divisors is prime.
Examples:
Input: Q[][] = {{2, 4}}
Output:
9
All the numbers in the range have only 2 divisors
which is prime.
(2 + 3 + 4) = 9.
Input: Q[][] = {{15, 17}, {2, 12}}
Output:
33
41
Approach: Find all the prime numbers and the count of divisors for each element up to a limit N using Sieve of Eratosthenes. Now create a prefix sum array sum[] where sum[i] will store the sum of elements from the range [0, i] whose count of divisors is prime using the Sieve array created earlier. Now every query can be answered in O(1) as sum[r] – sum[l – 1].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
const int N = 100000;
int prime[N];
int divi[N];
int sum[N];
void SieveOfEratosthenes()
{
for ( int i = 0; i < N; i++)
prime[i] = 1;
prime[0] = prime[1] = 0;
for ( int p = 2; p * p < N; p++) {
if (prime[p] == 1) {
for ( int i = p * p; i < N; i += p)
prime[i] = 0;
}
}
}
void DivisorCount()
{
for ( int i = 1; i < N; i++) {
for ( int j = i; j < N; j += i) {
divi[j]++;
}
}
}
void pre()
{
for ( int i = 1; i < N; i++) {
if (prime[divi[i]] == 1) {
sum[i] = i;
}
}
for ( int i = 1; i < N; i++)
sum[i] += sum[i - 1];
}
int main()
{
int l = 5, r = 8;
SieveOfEratosthenes();
DivisorCount();
pre();
cout << sum[r] - sum[l - 1];
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int N = 100000 ;
static int prime[] = new int [N];
static int divi[] = new int [N];
static int sum[] = new int [N];
static void SieveOfEratosthenes()
{
for ( int i = 0 ; i < N; i++)
prime[i] = 1 ;
prime[ 0 ] = prime[ 1 ] = 0 ;
for ( int p = 2 ; p * p < N; p++)
{
if (prime[p] == 1 )
{
for ( int i = p * p; i < N; i += p)
prime[i] = 0 ;
}
}
}
static void DivisorCount()
{
for ( int i = 1 ; i < N; i++)
{
for ( int j = i; j < N; j += i)
{
divi[j]++;
}
}
}
static void pre()
{
for ( int i = 1 ; i < N; i++)
{
if (prime[divi[i]] == 1 )
{
sum[i] = i;
}
}
for ( int i = 1 ; i < N; i++)
sum[i] += sum[i - 1 ];
}
public static void main(String args[])
{
int l = 5 , r = 8 ;
SieveOfEratosthenes();
DivisorCount();
pre();
System.out.println( sum[r] - sum[l - 1 ]);
}
}
|
Python3
from math import sqrt
N = 100000 ;
prime = [ 1 ] * N;
divi = [ 0 ] * N;
sum = [ 0 ] * N;
def SieveOfEratosthenes() :
for i in range (N) :
prime[i] = 1 ;
prime[ 0 ] = prime[ 1 ] = 0 ;
for p in range ( 2 , int (sqrt(N)) + 1 ) :
if (prime[p] = = 1 ) :
for i in range (p * p, N, p) :
prime[i] = 0 ;
def DivisorCount() :
for i in range ( 1 , N) :
for j in range (i, N , i) :
divi[j] + = 1 ;
def pre() :
for i in range ( 1 , N) :
if (prime[divi[i]] = = 1 ) :
sum [i] = i;
for i in range ( 1 , N) :
sum [i] + = sum [i - 1 ];
if __name__ = = "__main__" :
l = 5 ; r = 8 ;
SieveOfEratosthenes();
DivisorCount();
pre();
print ( sum [r] - sum [l - 1 ]);
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int N = 100000;
static int []prime = new int [N];
static int []divi = new int [N];
static int []sum = new int [N];
static void SieveOfEratosthenes()
{
for ( int i = 0; i < N; i++)
prime[i] = 1;
prime[0] = prime[1] = 0;
for ( int p = 2; p * p < N; p++)
{
if (prime[p] == 1)
{
for ( int i = p * p; i < N; i += p)
prime[i] = 0;
}
}
}
static void DivisorCount()
{
for ( int i = 1; i < N; i++)
{
for ( int j = i; j < N; j += i)
{
divi[j]++;
}
}
}
static void pre()
{
for ( int i = 1; i < N; i++)
{
if (prime[divi[i]] == 1)
{
sum[i] = i;
}
}
for ( int i = 1; i < N; i++)
sum[i] += sum[i - 1];
}
public static void Main(String []args)
{
int l = 5, r = 8;
SieveOfEratosthenes();
DivisorCount();
pre();
Console.WriteLine( sum[r] - sum[l - 1]);
}
}
|
Javascript
<script>
var N = 100000;
var prime = Array.from({length: N}, (_, i) => 0);
var divi = Array.from({length: N}, (_, i) => 0);
var sum = Array.from({length: N}, (_, i) => 0);
function SieveOfEratosthenes()
{
for (i = 0; i < N; i++)
prime[i] = 1;
prime[0] = prime[1] = 0;
for (p = 2; p * p < N; p++)
{
if (prime[p] == 1)
{
for (i = p * p; i < N; i += p)
prime[i] = 0;
}
}
}
function DivisorCount()
{
for (i = 1; i < N; i++)
{
for (j = i; j < N; j += i)
{
divi[j]++;
}
}
}
function pre()
{
for (i = 1; i < N; i++)
{
if (prime[divi[i]] == 1)
{
sum[i] = i;
}
}
for (i = 1; i < N; i++)
sum[i] += sum[i - 1];
}
var l = 5, r = 8;
SieveOfEratosthenes();
DivisorCount();
pre();
document.write( sum[r] - sum[l - 1]);
</script>
|
Time Complexity: O(N2)
Auxiliary Space:O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...