【JZOJ 5458】【NOIP2017提高A组冲刺11.7】质数 (线筛)

这篇博客介绍了如何使用线性筛算法找出在指定范围内,小X喜欢的数的数量,即质数和两个质数乘积的个数。通过示例输入和输出,展示了算法的正确性,并提出了通过线筛提前标记质数乘积的方法。

问题描述
小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感。小X 认为,质数是一切自然数起源的地方。
在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数字。
但由于小X 对质数的热爱超乎寻常,所以小X 同样喜欢那些虽然不是质数,但却是由两个质数相乘得来的数。
于是,我们定义,一个数是小X 喜欢的数,当且仅当其是一个质数,或是两个质数的乘积。
而现在,小X 想要知道,在L 到R 之间,有多少数是他喜欢的数呢?
输入
第一行输入一个正整数Q,表示询问的组数。
接下来Q 行。包含两个正整数L 和R。保证L≤R。
输出
输出Q 行,每行一个整数,表示小X 喜欢的数的个数。
样例输入
输入1:
1
1 6

输入2:
10
282 491
31 178
645 856
227 367
267 487
474 697
219 468
582 792
315 612
249 307

输入3:
10
20513 96703
15236 86198
23185 78205
40687 48854
42390 95450
63915 76000
36793 92543
35347 53901
44188 76922
82177 90900
样例输出
输出1:
5
样例1解释:
6以内的质数有2,3,5,而4=2*2,6=2*3。因此2,3,4,5,6都是小X 喜欢的数,而1 不是。

输出2:
97
78
92
65
102
98
114
90
133
29

输出3:
24413
23001
17784
2669
16785
3833
17712
6028
10442
2734
算法讨论
线筛筛出所有质数,筛的时候顺便标记一下两个质数相乘的数。

#include <cstdio>
#define MAX_N 10000006
using namespace std;
int prime[MAX_N],v[MAX_N],L[MAX_N],R[MAX_N],s[MAX_N];
int q,Max,m;
bool f[MAX_N],f1[MAX_N];

int main()
{
    freopen("prime.in","r",stdin);
    freopen("prime.out","w",stdout);
    scanf("%d",&q);
    for (int i=1;i<=q;i++)
    {
        scanf("%d%d",&L[i],&R[i]);
        if (R[i]>Max)
            Max=R[i];
    }
    for (int i=2;i<=Max;i++)
    {
        if (v[i]==0)
        {
            v[i]=i;
            prime[++m]=i;
            f[i]=1;
        }
        for (int j=1;j<=m;j++)
            if (v[i]<prime[j] || prime[j]>(Max / i))
                break;
            else
            {
                v[i*prime[j]]=prime[j];
                if (f[i])
                    f1[i*prime[j]]=1;
            }
    }
    for (int i=1;i<=Max;i++)
        if (f[i] || f1[i])
            s[i]=s[i-1]+1;
        else
            s[i]=s[i-1];
    for (int i=1;i<=q;i++)
        printf("%d\n",s[R[i]]-s[L[i]-1]);
    fclose(stdin); fclose(stdout);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值