有Q个查询。每个查询的形式为L和R。任务是在每个查询的给定范围内输出每个数字的素数个数的总和。
例子:
Input : Q = 2
L = 6, R = 10
L = 1, R = 5
Output : 7
4
For query 1,
6 => 2 [Prime factors are 2 and 3]
7 => 1
8 => 1
9 => 1
10 => 2
Sum = 2 + 1 + 1 + 1 + 2 = 7
For query 2,
1 => 0
2 => 1
3 => 1
4 => 1
5 => 1
Sum = 0 + 1 + 1 + 1 + 1 = 4.
方法1(强力):
这个想法是针对每个查询从L遍历到R,并针对每个数字找到素数,然后添加到答案中。
方法2(有效方法):
这个想法是使用Eratosthenes的Sieve方法来计算复合数素数的数量。就像,Eratosthenes筛网的内环用于标记复合数。我们可以使用它来增加数字的素数。无需将每个数组单元标记为0或1,我们可以存储该索引的质数。然后对于每个查询,找到从L到R的数组总和。
以下是此方法的实现:
C++
// C++ program to find sum prime factors
// in given range.
#include
#define MAX 1000006
using namespace std;
// using sieve method to evaluating
// the prime factor of numbers
void sieve(int count[])
{
for (int i = 2; i * i <= MAX; i++) {
// if i is prime
if (count[i] == 0) {
for (int j = 2 * i; j < MAX; j += i)
count[j]++;
// setting number of prime
// factor of a prime number.
count[i] = 1;
}
}
}
// Returns sum of counts of prime factors in
// range from l to r. This function mainly
// uses count[] which is filled by Sieve()
int query(int count[], int l, int r)
{
int sum = 0;
// finding the sum of number of prime
// factor of numbers in a range.
for (int i = l; i <= r; i++)
sum += count[i];
return sum;
}
// Driven Program
int main()
{
int count[MAX];
memset(count, 0, sizeof count);
sieve(count);
cout << query(count, 6, 10) << endl
<< query(count, 1, 5);
return 0;
}
Java
// Java program to find sum prime
// factors in given range.
class GFG {
static final int MAX = 1000006;
// using sieve method to evaluating
// the prime factor of numbers
static void sieve(int count[])
{
for (int i = 2; i * i <= MAX; i++) {
// if i is prime
if (count[i] == 0) {
for (int j = 2 * i; j < MAX; j += i)
count[j]++;
// setting number of prime
// factor of a prime number.
count[i] = 1;
}
}
}
// Returns sum of counts of prime factors in
// range from l to r. This function mainly
// uses count[] which is filled by Sieve()
static int query(int count[], int l, int r)
{
int sum = 0;
// finding the sum of number of prime
// factor of numbers in a range.
for (int i = l; i <= r; i++)
sum += count[i];
return sum;
}
// Driver code
public static void main(String[] args)
{
int count[] = new int[MAX];
sieve(count);
System.out.println(query(count, 6, 10) + " " + query(count, 1, 5));
}
}
// This code is contributed by Anant Agarwal.
Python3
# Python3 program to find sum prime factors
# in given range.
MAX = 100006;
count = [0] * MAX;
# using sieve method to evaluating
# the prime factor of numbers
def sieve():
i = 2;
while (i * i <= MAX):
# if i is prime
if (count[i] == 0):
for j in range(2 * i, MAX, i):
count[j] += 1;
# setting number of prime
# factor of a prime number.
count[i] = 1;
i += 1;
# Returns sum of counts of prime factors in
# range from l to r. This function mainly
# uses count[] which is filled by Sieve()
def query(l, r):
sum = 0;
# finding the sum of number of prime
# factor of numbers in a range.
for i in range(l, r + 1):
sum += count[i];
return sum;
# Driver Code
sieve();
print(query(6, 10), query(1, 5));
# This code is contributed by mits
C#
// C# program to find sum prime
// factors in given range.
using System;
class GFG {
static int MAX = 1000006;
// using sieve method to evaluating
// the prime factor of numbers
static void sieve(int[] count)
{
for (int i = 2; i * i <= MAX; i++)
{
// if i is prime
if (count[i] == 0) {
for (int j = 2 * i; j < MAX;
j += i)
count[j]++;
// setting number of prime
// factor of a prime number.
count[i] = 1;
}
}
}
// Returns sum of counts of prime factors
// in range from l to r. This function
// mainly uses count[] which is filled by
// Sieve()
static int query(int[] count, int l, int r)
{
int sum = 0;
// finding the sum of number of prime
// factor of numbers in a range.
for (int i = l; i <= r; i++)
sum += count[i];
return sum;
}
// Driver code
public static void Main()
{
int[] count = new int[MAX];
sieve(count);
Console.Write(query(count, 6, 10) +
" " + query(count, 1, 5));
}
}
// This code is contributed by nitin mittal.
PHP
输出:
7 4