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++ implementation to find the sum // of all composite numbers // in the given range #include <bits/stdc++.h> using namespace std;
// Prefix array to precompute // the sum of all composite // numbers long long pref[100001];
// Function that return number // num if num is composite // else return 0 int isComposite( int n)
{ // Corner cases
if (n <= 1)
return 0;
if (n <= 3)
return 0;
// This is checked so that we can skip
// middle five numbers in below loop
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;
} // Function to precompute the // sum of all Composite numbers // upto 10^5 void preCompute()
{ for ( int i = 1; i <= 100000; ++i) {
// isComposite()
// return the number i
// if i is Composite
// else return 0
pref[i] = pref[i - 1]
+ isComposite(i);
}
} // Function to print the sum // for each query void printSum( int L, int R)
{ cout << pref[R] - pref[L - 1]
<< endl;
} // Function to print sum of all // Composite numbers between // [L, R] void printSumComposite( int arr[][2],
int Q)
{ // Function that pre computes
// the sum of all Composite
// numbers
preCompute();
// Iterate over all Queries
// to print the sum
for ( int i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
} // Driver code int main()
{ // Queries
int Q = 2;
int arr[][2] = { { 10, 13 },
{ 12, 21 } };
// Function that print the
// the sum of all composite
// number in Range [L, R]
printSumComposite(arr, Q);
return 0;
} |
// Java implementation to find the sum // of all Composite numbers // in the given range import java.util.*;
class GFG {
// Prefix array to precompute
// the sum of all Composite
// number
static int [] pref = new int [ 100001 ];
// Function that return number
// num if num is Composite
// else return 0
static int isComposite( int n)
{
// Corner cases
if (n <= 1 )
return 0 ;
if (n <= 3 )
return 0 ;
// This is checked so that we can skip
// middle five numbers in below loop
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 ;
}
// Function to precompute the
// sum of all Composite numbers
// upto 100000
static void preCompute()
{
for ( int i = 1 ; i <= 100000 ; ++i) {
// checkComposite()
// return the number i
// if i is Composite
// else return 0
pref[i] = pref[i - 1 ]
+ isComposite(i);
}
}
// Function to print the sum
// for each query
static void printSum( int L, int R)
{
System.out.print(pref[R] - pref[L - 1 ]
+ "\n" );
}
// Function to print sum of all
// Composite numbers between
// [L, R]
static void printSumComposite( int arr[][],
int Q)
{
// Function that pre computes
// the sum of all Composite
// numbers
preCompute();
// Iterate over all Queries
// to print the sum
for ( int i = 0 ; i < Q; i++) {
printSum(arr[i][ 0 ], arr[i][ 1 ]);
}
}
// Driver code
public static void main(String[] args)
{
// Queries
int Q = 2 ;
int arr[][] = { { 10 , 13 },
{ 12 , 21 } };
// Function that print the
// the sum of all Composite
// number in Range [L, R]
printSumComposite(arr, Q);
}
} |
# Python implementation to find the sum # of all composite numbers # in the given range # Prefix array to precompute # the sum of all composite # number pref = [ 0 ] * 100001
# Function that return number # num if num is composite # else return 0 def isComposite(n):
# Corner cases
if (n < = 1 ):
return 0
if (n < = 3 ):
return 0
# This is checked so that we can skip
# middle five numbers in below loop
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
# Function to precompute the # sum of all composite numbers # upto 100000 def preCompute():
for i in range ( 1 , 100001 ):
# checkcomposite()
# return the number i
# if i is composite
# else return 0
pref[i] = pref[i - 1 ] + isComposite(i)
# Function to print the sum # for each query def printSum(L, R):
print (pref[R] - pref[L - 1 ])
# Function to print sum of all # composite numbers between def printSumcomposite(arr, Q):
# Function that pre computes
# the sum of all composite
# numbers
preCompute()
# Iterate over all Queries
# to print the sum
for i in range (Q):
printSum(arr[i][ 0 ], arr[i][ 1 ])
# Driver code if __name__ = = "__main__" :
Q = 2
arr = [[ 10 , 13 ], [ 12 , 21 ]]
# Function that print the
# the sum of all composite
# number in Range [L, R]
printSumcomposite(arr, Q)
|
// C# implementation to find the sum // of all Composite numbers // in the given range using System;
public class GFG{
// Prefix array to precompute // the sum of all Composite // number static int [] pref = new int [100001];
// Function that return number // num if num is Composite // else return 0 static int isComposite( int n)
{ // Corner cases
if (n <= 1)
return 0;
if (n <= 3)
return 0;
// This is checked so that we can skip
// middle five numbers in below loop
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;
} // Function to precompute the // sum of all Composite numbers // upto 100000 static void preCompute()
{ for ( int i = 1; i <= 100000; ++i)
{
// CheckComposite()
// return the number i
// if i is Composite
// else return 0
pref[i] = pref[i - 1] +
isComposite(i);
}
} // Function to print the sum // for each query static void printSum( int L, int R)
{ Console.Write(pref[R] -
pref[L - 1] + "\n" );
} // Function to print sum of all // Composite numbers between // [L, R] static void printSumComposite( int [,]arr,
int Q)
{ // Function that pre computes
// the sum of all Composite
// numbers
preCompute();
// Iterate over all Queries
// to print the sum
for ( int i = 0; i < Q; i++)
{
printSum(arr[i, 0], arr[i, 1]);
}
} // Driver code public static void Main(String[] args)
{ // Queries
int Q = 2;
int [,]arr = { { 10, 13 },
{ 12, 21 } };
// Function that print the
// the sum of all Composite
// number in Range [L, R]
printSumComposite(arr, Q);
} } // This code is contributed by Princi Singh |
<script> // Javascript implementation to find the sum // of all composite numbers // in the given range // Prefix array to precompute // the sum of all composite // numbers var pref = Array(100001).fill(0);
// Function that return number // num if num is composite // else return 0 function isComposite( n)
{ // Corner cases
if (n <= 1)
return 0;
if (n <= 3)
return 0;
// This is checked so that we can skip
// middle five numbers in below loop
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 to precompute the // sum of all Composite numbers // upto 10^5 function preCompute()
{ for ( var i = 1; i <= 100000; ++i) {
// isComposite()
// return the number i
// if i is Composite
// else return 0
pref[i] = pref[i - 1]
+ isComposite(i);
}
} // Function to print the sum // for each query function printSum(L, R)
{ document.write( pref[R] - pref[L - 1] + "<br>" );
} // Function to print sum of all // Composite numbers between // [L, R] function printSumComposite(arr, Q)
{ // Function that pre computes
// the sum of all Composite
// numbers
preCompute();
// Iterate over all Queries
// to print the sum
for ( var i = 0; i < Q; i++) {
printSum(arr[i][0], arr[i][1]);
}
} // Driver code // Queries var Q = 2;
var arr = [ [ 10, 13 ],
[ 12, 21 ] ];
// Function that print the // the sum of all composite // number in Range [L, R] printSumComposite(arr, Q); </script> |
22 116
Time Complexity: O(MAX3/2), where MAX = 100000
Auxiliary Space: O(MAX)