在2D阵列的形式提供的q的查询ARR [] [其每行包括两个数L和R,其表示所述范围[L,R]的]中,任务是找到所有合数躺在范围的总和[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
方法:
这个想法是使用前缀和数组。直到该特定索引为止的所有组合数的总和被预先计算并存储在数组pref []中,以便每个查询都可以在O(1)时间内得到回答。
- 初始化前缀数组pref [] 。
- 从1到N进行迭代,并检查数字是否为复合数字:
- 如果数字是合成的,则pref []的当前索引将存储数字和该数字在pref []的先前索引处的和。
- 别的PREF的当前索引[]是相同的PREF先前索引处的值[]。
- 对于Q查询,可以找到范围为[L,R]的所有组合数的总和,如下所示:
sum = pref[R] - pref[L - 1]
下面是上述方法的实现:
C++
// C++ implementation to find the sum
// of all composite numbers
// in the given range
#include
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
// 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);
}
}
Python3
# 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 prsum 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#
// 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
Javascript
输出:
22
116