版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/V5ZSQ/article/details/82588144
Description
求 ∼ 之间素数个数
Input
一行一个数
Output
一行一个数,表示答案
Sample Input
10
Sample Output
4
Solution
筛模版题
Code
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
#define maxn 700005
int p[maxn],f[maxn],np=0,m=350000;
ll s0[maxn];
void get_prime(int n)
{
for(int i=2;i<=n;i++)
{
s0[i]=s0[i-1];
if(!f[i])p[++np]=i,s0[i]++;
for(int j=1;j<=np&&i*p[j]<=n;j++)
{
f[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
np--;
}
ll val[maxn],n;
int nn,cnt;
void init()
{
nn=1;
while((ll)nn*nn<n)nn++;
cnt=0;
for(ll i=1;i<=n;i=n/(n/i)+1)val[++cnt]=n/i;
}
int ID(ll x)
{
if(x>=nn)return n/x;
return cnt-x+1;
}
ll g[maxn];
ll Get_g(ll n)
{
for(int i=1;i<=cnt;i++)g[i]=val[i]-1;
for(int j=1;j<=np;j++)
for(int i=1;i<=cnt&&(ll)p[j]*p[j]<=val[i];i++)
{
int k=ID(val[i]/p[j]);
g[i]=g[i]-(g[k]-(j-1));
}
return g[1];
}
int main()
{
get_prime(m);
while(~scanf("%lld",&n))
{
if(n<=m)
{
printf("%lld\n",s0[n]);
continue;
}
init();
ll ans=Get_g(n);
printf("%lld\n",ans);
}
return 0;
}