LibreOJ 6235 区间素数个数 发表于 2019.07.27 | 分类于 题解 | 阉割 Min_25 筛大法好。 Min_25 筛算法中有一个过程就是求 \(f\) 在质数处的值。 那么如果我们构造 \(f(n) = 1\) 那这个就相当于求质数的个数了。 代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344#include <cstdio>#include <cmath>using namespace std;const long long N = 1e11;const int MX = 32e4;long long n;int lim;int vis[MX + 5],cnt,prime[MX + 5];long long lis[2 * MX + 5];int tot,le[MX + 5],ge[MX + 5];long long G[2 * MX + 5];inline int &id(long long x){ return x <= lim ? le[x] : ge[n / x];}int main(){ for(register int i = 2;i <= MX;++i) { if(!vis[i]) prime[++cnt] = i; for(register int j = 1;j <= cnt && i * prime[j] <= MX;++j) { vis[i * prime[j]] = 1; if(!(i % prime[j])) break; } } scanf("%lld",&n),lim = sqrt(n); for(register long long l = 1,r;l <= n;l = r + 1) { r = n / (n / l); lis[id(n / l) = ++tot] = n / l; G[tot] = n / l - 1; } for(register int k = 1;k <= cnt;++k) { int p = prime[k]; long long s = (long long)prime[k] * prime[k]; for(register int i = 1;lis[i] >= s;++i) G[i] -= G[id(lis[i] / p)] - (k - 1); } printf("%lld\n",G[1]);} 本文作者: Alpha1022 本文链接: https://www.alpha1022.me/articles/loj-6235.htm 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!