由Eratosthenes筛法演变出的一种素数新筛法
这两天和walls老师交流讨论了一个中学竞赛题,我把原题稍作增强和变形,得到如下一个题:
从105到204这100个数中至少要选取多少个数才能保证选出的数中必有两个不是互素的?
我们知道最小的几个素数为2、3、5、7、11、13、17、……,由17*17>204可知,105到204之间的所有合数都有不大于13的素因数。于是可以这样构建标号分别为2、3、5、7、11、13的6个集合:
逐个遍历105到204的所有合数,如果它被2整除,就把它加入到标号为2的集合里;否则考察标号更大一级的集合,即如果它被3整除,则把它加入到标号为3的集合里;依次类推,每一个合数都会被加入到6个集合中某一个集合里。
上面提供了一种具体的构造集合的方法。由构造规则易知,这6个集合中任何一个集合,只要其中的数多于一个的话,从中任选两个数,它们都有该集合对应的标号作为它们的非1公约数,即它们不是互素的。
当然,并不需要真的去逐个遍历合数并采用上述的构造法把每个合数加到对应的集合里。这是因为如下两个因素:
(1)由前面的105到204之间的所有合数都有不大于13的素因数这一结论就说明105到204之间的每一个合数都可以放到上述的6个集合中的某一个里。比如110,它的不大于13的素因数有2、5和11,因此可以把110放到标号为2、5、11的任意一个集合里都是可以的;
(2)105到204之间有足够多的合数确保上述6个集合都不为空,这为上述的每个集合找一个独有的数就好,121=11*11,只能放到标号为11的集合里;169=13*13,只能放到标号为13的集合里;119=7*17,只能放到标号为7的集合里;125=5*5*5,只能放到标号为5的集合里;111=3*37,只能放到标号为3的集合里;128=2^7,只能放到标号为2的集合里。
我们甚至不必关心这些合数具体是哪些以及总数有多少个,但我们需要知道105到204之间有多少个素数,不然这个题就做不出来。设所求素数总数为n,那么由鸽巢原理马上就知道本题所求的答案为n+7。
接下来探讨如何求105到204之间的素数总数的问题。
最直接的办法是使用Eratosthenes筛法。为减少书写,同时去除2、3、5的倍数,得:
107 109
113 119
121 127
131 133 137 139
143 149
151 157
161 163 167 169
173 179
181 187
191 193 197 199
203
接着标出7的倍数(品红色标注)、11的倍数(绿色标注)和13的倍数(浅青色标注)。
剩下没有被标记的数都是素数,一共有19个。
中午在稿纸上由Eratosthenes筛法演变出一种更少书写的新筛法,说明如下:
依次分行写出13、11、7的倍数清单(略去2、3、5的倍数以及重复的数)
13: 143, 169
11: 121, 187
7: 119, 133, 161, 203
遍历105到204的数,依次写下不是2、3、5的倍数且不在13、11、7的倍数清单里的数:
107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199
一共是19个素数。
由Eratosthenes筛法演变出的一种素数新筛法的更多相关文章
- 下面给出了四种设计模式的作用: 外观(F
下面给出了四种设计模式的作用: 外观(Fa?ade :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用: 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动 ...
- 面试官:spring中定义bean的方法有哪些?我一口气说出了12种,把面试官整懵了。
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- poj2689 Prime Distance(素数区间筛法)
题目链接:http://poj.org/problem?id=2689 题目大意:输入两个数L和U(1<=L<U<=2 147 483 647),要找出两个相邻素数C1和C2(L&l ...
- 找出10000内的素数 CSP
"Problem: To print in ascending order all primes less than 10000. Use an array of processes, SI ...
- POJ-2689-Prime Distance(素数区间筛法)
链接: https://vjudge.net/problem/POJ-2689 题意: The branch of mathematics called number theory is about ...
- Swift 中异常抛出和四种异常处理
在Swift中你可以像其他语言一样抛出异常处理异常,今天我们就详细地说说Swift中的异常抛出和处理. 在一开始我们要定义错误或者说是异常,Swift中的一些简单异常可以使用枚举定义,注意这个枚举要继 ...
- 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- 基于Visual C++2013拆解世界五百强面试题--题10-找出N个数种最大的K个数
有一亿个整数,请找出最大的 1000 个,要求时间越短越好, 空间占用越好越好. 如果不考虑时间效率,很容易想到解决方法,我们只需存储前一千个数, 然后依次读入后面的数和这一千个数组比较,替换其中比较 ...
- 长度为n的数组,有一个数重复出现了n/2+1次,找出(三种方法)
问题: 长度为n的数组,有一个数重复出现了n/2+1次,找出这个数: 解决: 比较直接的思路是遍历每个元素,让其与剩下其他元素比较,相等一次计数器sum++,直到sum=n/2+1为止: #inc ...
随机推荐
- 最大网络流dinic
初始化flow(最大流量)为INF(极大值),建边(正向弧和反向弧) bfs寻找增广路看看有没有路,顺便进行深度标号.如果没有路直接结束输出flow. 如果有,我们按照深度dfs.dfs时注意在给正向 ...
- [HNOI2008]GT考试 题解
这题比较难搞.考虑设计状态:\(f_{i,j}\) 表示当前考虑到 \(X_i\) 位,且 \(X\) 的后 \(j\) 位刚好与 \(A\) 列匹配时的方案数.最终答案为 \(\sum_{i=0}^ ...
- python中浮点数比较判断!为什么不能用==
问题:浮点数比较为什么不能用==来写? 答:计算机里面的数字是由二进制保存的,在计算机内部有些数字不能准确的保存,于是就保存了一个最靠近的数字. 计算机表示浮点数(float或double类型)都有一 ...
- oracle(enquences & latches )lock (oracle 锁大全)
资料来自官方文档: https://docs.oracle.com/database/121/CNCPT/consist.htm#CNCPT1333 https://docs.oracle.com/d ...
- Python小白的数学建模课-12.非线性规划
非线性规划是指目标函数或约束条件中包含非线性函数的规划问题,实际就是非线性最优化问题. 从线性规划到非线性规划,不仅是数学方法的差异,更是解决问题的思想方法的转变. 非线性规划问题没有统一的通用方法, ...
- 背单词(AC自动机+线段树+dp+dfs序)
G. 背单词 内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使 ...
- Mybatis-Plus的配置和基本使用
目录 基本配置 简单使用 代码生成器 基本配置 首先新建一个springboot项目,然后导入数据库驱动,lombok和mybatis-plus依赖: <!-- 数据库驱动 --> < ...
- CreatFile打开驱动失败
使用 CreateFile(DRIVER_PATH, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_AT ...
- WPF Combox实现下拉多选,可选中多个值
自定义多选MultiCombox,可以实现下拉列表多选 using System; using System.Collections.Generic; using System.Collections ...
- Java方法03——方法的重载
方法的重载(println 就是一个典型的重载(源码)) 重载就是在一个类中,有相同的函数名称,但形参不同的函数 方法重载的规则 方法名称必须相同 参数列表必须不同(个数不同.或者类型不同.参数排列顺 ...