📌  相关文章
📜  查询一定范围内的素数计数总和

📅  最后修改于: 2021-04-29 02:38:26             🧑  作者: Mango

Q个查询。每个查询的形式为LR。任务是在每个查询的给定范围内输出每个数字的素数个数的总和。

例子:

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