min_25筛:素数计数
xenonex
2018-12-08 23:31:07
挂两个神仙的博客
https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-sp34096
https://www.cnblogs.com/cjyyb/p/9185093.html
然后是[luoguP3912素数个数](https://www.luogu.org/problemnew/show/P3912)的31ms代码
```cpp
#include<cstdio>
#include<cmath>
int prime[1234],v[10010],g1[10010],g2[10010],pcnt;
bool isnp[10010];
void sieve(int n)
{
for(int i=2;i<=n;i++)
{
if(!isnp[i])prime[pcnt++] = i;
for(int j=0,k;j<pcnt&&(k=i*prime[j])<=n;j++)
{
isnp[k] = 1;
if(i%prime[j] == 0)break;
}
}
}
void work_g(int n)
{
int sqr = sqrt(n),end,val,i,j,t1;
for(i=1,j=0;i<=sqr;i++)g1[i] = i-1, g2[i] = (v[++j]=n/i)-1;
for(j=0;j<pcnt;j++)
{
end = prime[j]*prime[j];
for(i=1;i<=sqr&&(val=v[i])>=end;i++)
t1 = val/prime[j], g2[i] += j-(t1 <= sqr? g1[t1]:g2[n/t1]);
for(i=sqr;i>=end;i--)g1[i] += j-g1[i/prime[j]];
}
}
int main()
{
int n;
scanf("%d",&n);
sieve(sqrt(n));
work_g(n);
printf("%d",g2[1]);
return 0;
}
```
(懒