题目描述
如果一个合数x=p⋅q,p,q是素数且p≠q,我们称x是双素数。 现给你一个区间[a,b],求区间内的的双素数个数。
输入
第一行是一个整数T(1≤T≤30000),为样例的数目。 以后每行一个样例,为两个整数a,b(1≤a≤b≤106)
输出
依次每行输出一个样例的结果。
样例输入
3 1 10 1 100 1 1000000样例输出
2 30 209867
解题思路: 素数筛法 + 遍历 + 前缀和
先用素数筛 找到范围内的所有素数, 然后遍历素数集合,得到 Dual Prime(双素数),最后前缀和相加,得到双素数 前缀和数组。
AC代码(埃筛):
#include <stdio.h>
const int N = 1e6+5;
int prime[N] = {0};
int hesu[N]= {0};
int main()
{
for (int i = 2; i*i <= N; i ++) // 埃筛
if (prime[i] == 0)
for (int j = i*i; j <= N; j+=i)
prime[j] = 1;
for (int i = 2; i*i < N; i ++) // 找到满足条件的 合数
for (int j = i+1; i*j < N; j ++)
if (prime[i] == 0 && prime[j] == 0)
hesu[i*j] = 1;

文章讲述了如何使用素数筛法(包括埃筛和欧筛)计算给定区间内的双素数个数,通过遍历素数集合并计算双素数的前缀和实现。提供了两个不同代码实现的示例。
最低0.47元/天 解锁文章
1586





