ACM编程模板:素数筛选与随机素数测试
需积分: 9 96 浏览量
更新于2024-07-18
收藏 98KB DOCX 举报
"编程模板,包括ACM竞赛相关的编程技巧,如素数判断和生成、随机素数测试等。"
在编程中,特别是在ACM(国际大学生程序设计竞赛)这样的高强度算法竞赛中,掌握高效的算法和数据结构是至关重要的。本资源整理了一些编程模板,这些模板可以帮助参赛者快速解决问题,提高代码效率。以下将详细解释其中涉及到的几个关键知识点:
1. **素数判断**:
- 为了判断小于`MAXN`(在这里是1000010)的数是否为素数,我们可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)。这个方法的核心是通过一个布尔数组`notprime`来记录每个数是否为合数。初始化时,所有数都假定为素数(`notprime`设为`false`),然后从2开始遍历,将所有2的倍数标记为合数。接着,我们遍历到根号`MAXN`,对于每个未被标记的数`i`,将其所有倍数标记为合数。这种方法可以有效地避免溢出问题,因为一旦`i > MAXN / i`,那么`i`的倍数肯定大于`MAXN`。
2. **生成连续素数表**:
- 在生成小于等于`MAXN`(这里是100000)的素数列表时,我们同样使用了埃拉托斯特尼筛法,但稍有不同。这里我们维护了一个整数数组`prime`,用来存储素数。初始时,数组元素设为0。我们遍历2到`MAXN`,对于每个未被标记的数`i`,将其作为素数加入到列表中(`prime[++prime[0]]=i`),然后更新数组,将所有`prime[j]*i`(j从1到当前已知素数个数`prime[0]`)标记为非素数。如果`i`能被当前已知的任何素数整除,我们就停止更新,因为这意味着`i`不是素数。
3. **随机素数测试**:
- 有时候我们需要快速测试一个大数是否可能是素数,这就需要用到`miller`函数,它基于米勒-拉宾素性检验(Miller-Rabin Primality Test)。这个测试基于概率,它不是绝对正确的,但对于足够大的随机数,错误概率极低。函数`witness(a, n)`计算见证人`a`对数`n`的见证值。它使用了一种叫做快速幂的方法(`d=(d*d)%n`)来减少计算次数。如果在某次迭代中`d`变为1且`x`既不等于1也不等于`n-1`,则返回1表示可能不是素数。同时,根据位运算判断是否需要乘以`a`。最终,如果`d`等于1,则返回0表示`n`可能是素数,否则返回1表示可能不是素数。
这些编程模板对于ACM竞赛选手来说非常实用,它们不仅能够帮助快速解决特定类型的问题,还可以作为理解算法和数据结构的实例。在实际编程中,理解和熟练应用这些模板可以显著提升代码质量和效率。
2013-08-28 上传
2021-06-10 上传
2010-10-23 上传
2019-11-16 上传
点击了解资源详情
2023-09-04 上传
2021-02-18 上传
DonotFAS
- 粉丝: 0
- 资源: 1
最新资源
- 高清艺术文字图标资源,PNG和ICO格式免费下载
- mui框架HTML5应用界面组件使用示例教程
- Vue.js开发利器:chrome-vue-devtools插件解析
- 掌握ElectronBrowserJS:打造跨平台电子应用
- 前端导师教程:构建与部署社交证明页面
- Java多线程与线程安全在断点续传中的实现
- 免Root一键卸载安卓预装应用教程
- 易语言实现高级表格滚动条完美控制技巧
- 超声波测距尺的源码实现
- 数据可视化与交互:构建易用的数据界面
- 实现Discourse外聘回复自动标记的简易插件
- 链表的头插法与尾插法实现及长度计算
- Playwright与Typescript及Mocha集成:自动化UI测试实践指南
- 128x128像素线性工具图标下载集合
- 易语言安装包程序增强版:智能导入与重复库过滤
- 利用AJAX与Spotify API在Google地图中探索世界音乐排行榜