经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
loj#6235. 区间素数个数(min25筛)
来源:cnblogs  作者:自为风月马前卒  时间:2018/12/12 12:00:24  对本文有异议

题意

题目链接

Sol

min25筛的板子题,直接筛出\(g(N, \infty)\)即可

筛的时候有很多trick,比如只存\(\frac{N}{x}\)的值,第二维可以滚动数组滚动掉

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. //#define int long long
  4. using namespace std;
  5. const int MAXN = 2e6 + 10;
  6. int Lim, vis[MAXN], prime[MAXN], tot;
  7. LL N, g[MAXN], id[MAXN], cnt, pos1[MAXN], pos2[MAXN];
  8. void Get(int N) {
  9. vis[1] = 1;
  10. for(int i = 2; i <= N; i++) {
  11. if(!vis[i]) prime[++tot] = i;
  12. for(int j = 1; j <= tot && i * prime[j] <= N; j++) {
  13. vis[i * prime[j]] = 1;
  14. if(!(i % prime[j])) break;
  15. }
  16. }
  17. }
  18. LL get(LL x) {
  19. return x <= Lim ? pos1[x] : pos2[N / x];
  20. }
  21. signed main() {
  22. cin >> N; Lim = sqrt(N);
  23. Get(Lim);
  24. for(LL i = 1, j; i <= N; i = N / j + 1) {
  25. j = N / i; id[++cnt] = j; g[cnt] = id[cnt] - 1;
  26. j <= Lim ? pos1[j] = cnt : pos2[N / j] = cnt;;
  27. }
  28. for(int j = 1; j <= tot; j++)
  29. for(LL i = 1; 1ll * prime[j] * prime[j] <= id[i]; i++)
  30. g[i] -= g[get(id[i] / prime[j])] - (j - 1);
  31. cout << g[1];
  32. return 0;
  33. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号