洛谷 P3912 素数个数

Posted 一蓑烟雨任生平

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P3912 素数个数相关的知识,希望对你有一定的参考价值。

题目描述

1,2,\cdots,N1,2,?,N 中素数的个数。

输入输出格式

输入格式:

 

1 个整数NN。

 

输出格式:

 

1 个整数,表示素数的个数。

 

输入输出样例

输入样例#1: 复制
10
输出样例#1: 复制
4

说明

• 对于40% 的数据,1 \le N \le 10^61N106;

• 对于80% 的数据,1 \le N \le 10^71N107;

• 对于100% 的数据,1 \le N \le 10^81N108。

思路:RE,线性筛一边就可以做出来。bool只占一个字节,所以不会MLE。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,tot;
int prime[1000000];
bool yes[10000000];
void shai(){
    memset(yes,true,sizeof(yes));
    yes[1]=false;
    for(int i=2;i<=n;i++){
        if(yes[i])    prime[++tot]=i;
        for(int j=1;i*prime[j]<=n;j++){
            yes[i*prime[j]]=false;
            if(i%prime[j]==0)    break;    
        }
    }
}
int main(){
    scanf("%d",&n);
    shai();
    cout<<tot;
}

把上面的代码多开一个0 就可以AC了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,tot;
int prime[1000000];
bool yes[10000000];
void shai(){
    memset(yes,true,sizeof(yes));
    yes[1]=false;
    for(int i=2;i<=n;i++){
        if(yes[i])    prime[++tot]=i;
        for(int j=1;i*prime[j]<=n;j++){
            yes[i*prime[j]]=false;
            if(i%prime[j]==0)    break;    
        }
    }
}
int main(){
    scanf("%d",&n);
    shai();
    cout<<tot;
}

当然听说大佬用了一种叫Meissel Lehmer Algorithm的算法跑的飕飕的。对于我一个蒟蒻来说,这个算法太高级了,诸君还是自行学习吧。我在这里就不粘代码了。

以上是关于洛谷 P3912 素数个数的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]

洛谷 P1463 [SDOI2005]反素数ant

洛谷 P1463 [SDOI2005]反素数ant && codevs2912反素数

[洛谷P3383]线性筛素数-欧拉筛法

洛谷 P1835 素数密度_NOI导刊2011提高(04)题解

[洛谷P1835]素数密度