刚刚学了一种新的素数筛选法,效率比原先的要高一些,据说当n趋近于无穷大时这个的时间复杂度趋近O(n)。本人水平有限,无法证明。

这是道水题,贴代码出来重点是欧拉筛选法。我把原来普通的筛选法贴出来。

  1. //2013-11-07-22.30
  2. //poj 2909
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. const int maxn = (1<<15)+5;
  7. bool vis[maxn];
  8. int pr[3416];
  9. int cnt = 1;
  10. void getpr()
  11. {
  12. for (int i = 2; i < maxn; i++)
  13. {
  14. if (vis[i] == 0)
  15. pr[cnt++] = i;
  16. for (int j = 1; j < cnt; j++)
  17. {
  18. if (i*pr[j] > maxn)
  19. break;
  20. vis[i*pr[j]] = 1;
  21. if (i%pr[j] == 0)
  22. break;
  23. }
  24. }
  25. }
  26. //void getpr()
  27. //{
  28. // for (int i = 2; i < maxn; i++)
  29. // {
  30. // if (vis[i])
  31. // continue;
  32. // else
  33. // pr[cnt++] = i;
  34. // for (int j = i<<1; j < maxn; j += i)
  35. // vis[j] = true;
  36. // }
  37. //}
  38. int main()
  39. {
  40. int n;
  41. getpr();
  42. while (scanf("%d", &n) && n)
  43. {
  44. int m = n>>1;
  45. int ans = 0;
  46. for (int i = 1; i < cnt; i++)
  47. {
  48. if (pr[i] > m)
  49. break;
  50. if (vis[n-pr[i]] == 0)
  51. ans++;
  52. }
  53. printf("%d\n", ans);
  54. }
  55. return 0;
  56. }

我把vis改成int型,然后对代码稍微改了一下 ,增加了计算总共访问过多少次vis数组的功能,欧拉筛法共访问29258次,而普通筛分访问了80298次,明显效率更低一些,改动代码如下,有兴趣可以自己试试。

  1. //2013-11-07-22.30
  2. //poj 2909
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. const int maxn = (1<<15)+5;
  7. int vis[maxn];
  8. int pr[3416];
  9. int cnt = 1;
  10.  
  11. //void getpr() //欧拉筛法
  12. //{
  13. // for (int i = 2; i < maxn; i++)
  14. // {
  15. // if (vis[i] == 0)
  16. // pr[cnt++] = i;
  17. // for (int j = 1; j < cnt; j++)
  18. // {
  19. // if (i*pr[j] > maxn)
  20. // break;
  21. // vis[i*pr[j]]++;
  22. // if (i%pr[j] == 0)
  23. // break;
  24. // }
  25. // }
  26. //}
  27. void getpr() //普通筛法
  28. {
  29. for (int i = 2; i < maxn; i++)
  30. {
  31. if (vis[i])
  32. continue;
  33. else
  34. pr[cnt++] = i;
  35. for (int j = i<<1; j < maxn; j += i)
  36. vis[j]++;
  37. }
  38. }
  39. int main()
  40. {
  41. int n;
  42. getpr();
  43. int sum = 0;
  44. for (int i = 1; i < maxn; i++)
  45. sum += vis[i];
  46. printf("sum = %d\n", sum);
  47.  
  48. while (scanf("%d", &n) && n)
  49. {
  50. int m = n>>1;
  51. int ans = 0;
  52. for (int i = 1; i < cnt; i++)
  53. {
  54. if (pr[i] > m)
  55. break;
  56. if (vis[n-pr[i]] == 0)
  57. ans++;
  58. }
  59. printf("%d\n", ans);
  60. }
  61. return 0;
  62. }

poj2909 欧拉素数筛选的更多相关文章

  1. uva 11426 线性欧拉函数筛选+递推

    Problem J GCD Extreme (II) Input: Standard Input Output: Standard Output Given the value of N, you w ...

  2. HDU - 4548-美素数 (欧拉素数筛+打表)

    小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识.  问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数&quo ...

  3. 2018 南京预选赛 J Sum ( 欧拉素数筛 、Square-free Number、DP )

    题目链接 题意 : 定义不能被平方数整除的数为 Square-free Number 定义 F(i) = 有几对不同的 a 和 b 使得 i = a * b 且 a .b 都是 Square-free ...

  4. 素数筛总结篇___Eratosthenes筛法和欧拉筛法(*【模板】使用 )

    求素数 题目描述 求小于n的所有素数的数量. 输入 多组输入,输入整数n(n<1000000),以0结束. 输出 输出n以内所有素数的个数. 示例输入 10 0 示例输出 4 提示 以这道题目为 ...

  5. (转载)O(N)的素数筛选法和欧拉函数

    转自:http://blog.csdn.net/dream_you_to_life/article/details/43883367 作者:Sky丶Memory 1.一个数是否为质数的判定. 质数,只 ...

  6. 素数的线性筛 && 欧拉函数

    O(n) 筛选素数 #include<bits/stdc++.h> using namespace std; const int M = 1e6 + 10 ; int mindiv[M] ...

  7. BZOJ 2818 Gcd(欧拉函数+质数筛选)

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 9108  Solved: 4066 [Submit][Status][Discu ...

  8. 素数判断-----埃氏筛法&欧拉筛法

    埃氏筛法 /* |埃式筛法| |快速筛选素数| |15-7-26| */ #include <iostream> #include <cstdio> using namespa ...

  9. 转载:Candy? 在线性时间内求出素数与欧拉函数

    转载自:http://www.cnblogs.com/candy99/p/6200660.html 2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB ...

随机推荐

  1. html、jsp页面标签的遍历

    应用场景:最近的项目中二级子页面遍历生成.操作表格比较多,记录一下一直用的遍历方法. 一般此类表格都是通过ajax请求数据,然后从callbackFunction中获取数据集合,遍历生成表: eg: ...

  2. Mysql事务隔离级别和锁机制

    一.Spring支持四种事务隔离级别: 1.ISOLATION_READ_UNCOMMITTED(读未提交):这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据. 2.ISOLAT ...

  3. Go - Slice 切片

    概述 切片是一种动态数组,比数组操作灵活,长度不是固定的,可以进行追加和删除. len() 和 cap() 返回结果可相同和不同. 声明切片 //demo_7.go package main impo ...

  4. python多线程爬取图片实例

    今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1. ...

  5. hive 常用的 join 操作 实例

    test_a 表 id value 1 java 2 python 3 c++ test_b 表 id value 1 java 2 go 3 php 4 c++ 1. join 计算的是笛卡尔积,不 ...

  6. 微服务-springboot热部署

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. IDEA进行热 ...

  7. 正确写网站title、keywords、description

    一.title title,也就是标题,是在浏览器上面显示出来的,方便用户了解这个页面的内容;特别是搜索引擎判断你网页内容的主要根据.搜索引擎就很大部分是依靠网站title来判断你网站是关于什么内容的 ...

  8. Codeforces 777E:Hanoi Factory(贪心+栈)

    http://codeforces.com/problemset/problem/777/E 题意:给出n个环状圆柱,每个圆环有一个内半径a,外半径b,和高度h,只有外半径bj <= bi并且b ...

  9. Google 的 Java 编码规范,参考学习!

    这份文档是 Google Java 编程风格规范的完整定义.当且仅当一个 Java 源文件符合此文档中的规则, 我们才认为它符合 Google 的 Java 编程风格. 与其它的编程风格指南一样,这里 ...

  10. Abnormal build process termination IDEA启动报错

    报错如下: Error:Abnormal build process termination: "C:Program FilesJavajdk1.11.0_1injava" -Xm ...