区间素数个数(Min_25筛)
Posted hsez_cyx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间素数个数(Min_25筛)相关的知识,希望对你有一定的参考价值。
Description
求 $1-n$ 间素数个数
$n<=10^11$
Solution
将完全积性函数 $I(i)=1$ 作为 $g$
然后开始火速筛素数
Code
#include <cstdio> #include <cstdlib> #include <cmath> #define ll long long using namespace std; const int N=1e6+10; int vis[N],tot,cnt; ll g[N],n,prime[N],w[N],ind[2][N]; int main() { scanf("%lld",&n); ll sq=sqrt(n); for(int i=2;i<=sq;i++) { if(!vis[i]) prime[++tot]=i; for(int j=1;j<=tot && prime[j]<=sq/i;j++) { vis[prime[j]*i]=1; if(i%prime[j]==0) break; } } for(ll l=1,r;l<=n;l=r+1) { r=n/(n/l); w[++cnt]=n/l; g[cnt]=w[cnt]-1; ind[w[cnt]>sq][w[cnt]>sq?n/w[cnt]:w[cnt]]=cnt; } for(int i=1;i<=tot;i++) for(int j=1;j<=cnt && prime[i]*prime[i]<=w[j];j++) { ll x=w[j]/prime[i]; g[j]-=g[ind[x>sq][x>sq?n/x:x]]-(i-1); } printf("%lld\n",g[1]); return 0; }
以上是关于区间素数个数(Min_25筛)的主要内容,如果未能解决你的问题,请参考以下文章