区间素数筛

题目:P1835 素数密度

题目中区间的端点很大,但是区间的长度不长.

解题思路:

1.先用埃氏筛选掉 1sqrt(R) 的合数

2.用第一步的素数表筛选掉 LR 的合数 (一二步一起进行)

3.计算素数个数

代码:

 

#include<bits/stdc++.h>
using namespace std;
const int MA = 1e6+5;
typedef long long LL;
bool book[MA];
bool a[MA];
LL pri[MA];
LL cnt = 0;

void Prime(LL L,LL R){
    memset(book,true,sizeof(book));
    memset(a,true,sizeof(a));
    book[0] = false , book[1] = false;
    for(LL i = 2 ; i * i <= R ; i++){
        if(book[i]){
            pri[cnt++] = i;
            for(LL j = i + i ; j * j <= R ; j += i){
                book[j] = false;
            }
            LL t = (L+i-1)/i;//向上进位
            for(LL j = t * i ; j <= R ; j += i){
                a[j-L]=false;
            } 
        }
    }
}
int main(){
    LL L,R;
    scanf("%lld %lld",&L,&R);
    Prime(L,R);
    LL ans = 0;
    for(LL i=0;i<=R-L;i++){
        if(a[i] == true)ans++;
    }
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2020-06-21 17:04  w_w_t  阅读(140)  评论(0编辑  收藏  举报