Sum of all composite numbers lying in the range [L, R] for Q queries
Last Updated :
11 Mar, 2024
Given Q queries in the form of 2D array arr[][] whose every row consists of two numbers L and R which denotes the range [L, R], the task is to find the sum of all Composite Numbers lying in range [L, R].
Input: arr[][] = {{10, 13}, {12, 21}}
Output:
22
116
Explanation:
From 10 to 13 only 10 and 12 is the composite number.
From 12 to 21, there are 7 composite numbers
12 + 14 + 15 + 16 + 18 + 20 + 21 = 116
Input: arr[][] = {{ 10, 10 }, { 258, 785 }, {45, 245 }, { 1, 1000}}
Output:
10
233196
23596
424372
Approach:
The idea is to use the prefix sum array. The sum of all composite number till that particular index is precomputed and stored in an array pref[] so that every query can be answered in O(1) time.
- Initialise the prefix array pref[].
- Iterate from 1 to N and check if the number is composite or not:
- If the number is composite then, the current index of pref[] will store the sum of the number and the number at previous index of pref[].
- Else the current index of pref[] is same as the value at previous index of pref[].
- For Q queries the sum of all composite numbers for range [L, R] can be found as follows:
sum = pref[R] - pref[L - 1]
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
long long pref[100001];
int isComposite( int n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 0;
if (n % 2 == 0 || n % 3 == 0)
return n;
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return n;
return 0;
}
void preCompute()
{
for ( int i = 1; i <= 100000; ++i) {
pref[i] = pref[i - 1]
+ isComposite(i);
}
}
void printSum( int L, int R)
{
cout << pref[R] - pref[L - 1]
<< endl;
}
void printSumComposite( int arr[][2],
int Q)
{
preCompute();
for ( int i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
}
int main()
{
int Q = 2;
int arr[][2] = { { 10, 13 },
{ 12, 21 } };
printSumComposite(arr, Q);
return 0;
}
|
Java
import java.util.*;
class GFG {
static int [] pref = new int [ 100001 ];
static int isComposite( int n)
{
if (n <= 1 )
return 0 ;
if (n <= 3 )
return 0 ;
if (n % 2 == 0 || n % 3 == 0 )
return n;
for ( int i = 5 ; i * i <= n; i = i + 6 )
if (n % i == 0 || n % (i + 2 ) == 0 )
return n;
return 0 ;
}
static void preCompute()
{
for ( int i = 1 ; i <= 100000 ; ++i) {
pref[i] = pref[i - 1 ]
+ isComposite(i);
}
}
static void printSum( int L, int R)
{
System.out.print(pref[R] - pref[L - 1 ]
+ "\n" );
}
static void printSumComposite( int arr[][],
int Q)
{
preCompute();
for ( int i = 0 ; i < Q; i++) {
printSum(arr[i][ 0 ], arr[i][ 1 ]);
}
}
public static void main(String[] args)
{
int Q = 2 ;
int arr[][] = { { 10 , 13 },
{ 12 , 21 } };
printSumComposite(arr, Q);
}
}
|
Python3
pref = [ 0 ] * 100001
def isComposite(n):
if (n < = 1 ):
return 0
if (n < = 3 ):
return 0
if (n % 2 = = 0 or n % 3 = = 0 ):
return n
i = 5
while (i * i < = n):
if (n % i = = 0 or n % (i + 2 ) = = 0 ):
return n
i = i + 6
return 0
def preCompute():
for i in range ( 1 , 100001 ):
pref[i] = pref[i - 1 ] + isComposite(i)
def printSum(L, R):
print (pref[R] - pref[L - 1 ])
def printSumcomposite(arr, Q):
preCompute()
for i in range (Q):
printSum(arr[i][ 0 ], arr[i][ 1 ])
if __name__ = = "__main__" :
Q = 2
arr = [[ 10 , 13 ], [ 12 , 21 ]]
printSumcomposite(arr, Q)
|
C#
using System;
public class GFG{
static int [] pref = new int [100001];
static int isComposite( int n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 0;
if (n % 2 == 0 || n % 3 == 0)
return n;
for ( int i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return n;
return 0;
}
static void preCompute()
{
for ( int i = 1; i <= 100000; ++i)
{
pref[i] = pref[i - 1] +
isComposite(i);
}
}
static void printSum( int L, int R)
{
Console.Write(pref[R] -
pref[L - 1] + "\n" );
}
static void printSumComposite( int [,]arr,
int Q)
{
preCompute();
for ( int i = 0; i < Q; i++)
{
printSum(arr[i, 0], arr[i, 1]);
}
}
public static void Main(String[] args)
{
int Q = 2;
int [,]arr = { { 10, 13 },
{ 12, 21 } };
printSumComposite(arr, Q);
}
}
|
Javascript
<script>
var pref = Array(100001).fill(0);
function isComposite( n)
{
if (n <= 1)
return 0;
if (n <= 3)
return 0;
if (n % 2 == 0 || n % 3 == 0)
return n;
for ( var i = 5; i * i <= n; i = i + 6)
if (n % i == 0 || n % (i + 2) == 0)
return n;
return 0;
}
function preCompute()
{
for ( var i = 1; i <= 100000; ++i) {
pref[i] = pref[i - 1]
+ isComposite(i);
}
}
function printSum(L, R)
{
document.write( pref[R] - pref[L - 1] + "<br>" );
}
function printSumComposite(arr, Q)
{
preCompute();
for ( var i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
}
var Q = 2;
var arr = [ [ 10, 13 ],
[ 12, 21 ] ];
printSumComposite(arr, Q);
</script>
|
Time Complexity: O(MAX3/2), where MAX = 100000
Auxiliary Space: O(MAX)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...