素数筛选-题型归纳与总结

简介: 素数筛选-题型归纳与总结

一、概念

Eratosthenes筛选法【埃拉托斯特尼筛法】(如果3是素数,那么6,9,12···一定不是素数 )、欧拉筛法、拉宾-米勒 (R a b i n − M i l l e r Rabin-MillerRabin−Miller) 大数

二、模板

统计所有小于等于非负整数 n ( 0 ≤ n ≤ 5 × 10^6^ ) 的素数的数量。

int countPrimes(int n){
        int cnt = 0;   // 出现过素数的次数                           
        int[] f = new int[5000001]; // 0=素数,1=合数
        f[0] = f[1] = 1;  // 0 和 1 都不是素数,所以都标记为 1;                      
        for(int i = 2; i <= n; ++i) {
            if(f[i] == 0) {
                ++ cnt;                             
                for(int j = i * i; j <= n; j += i) {  
                    f[j] = 1;                    
                }
            }
        }
        return cnt;
    }

三、例题

题:1175. 质数排列

请你帮忙给从 1 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;你需要返回可能的方案总数。

让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。

由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。

示例 1:

输入:n = 5
输出:12
解释:举个例子,[1,2,5,4,3] 是一个有效的排列,但 [5,2,3,4,1] 不是,因为在第二种情况里质数 5 被错误地放在索引为 1 的位置上。

示例 2:

输入:n = 100
输出:682289015

提示:

1 <= n <= 100

解:

解题思路:Eratosthenes筛选法

AC代码:

class Solution {
    public int numPrimeArrangements(int n) {
        int[] f = new int[101];
        int cnt = 0;
        f[0] = f[1] = 1; // 0是素数,1是合数
        for(int i = 2; i <= n; i ++) {
            if(f[i] == 0) { // 如果是素数
                cnt ++;
                for(int j = i * i; j <= n; j += i){
                    f[j] = 1;
                }
            }
        }
        long ans = 1L;
        // cnt个质数排列组合
        ans = pai(ans, cnt);
        // n-cnt个合数排列组合
        ans = pai(ans, n - cnt);
        return (int)ans;
    }
    // 求x个排列组合
    long pai(long ans, int num) {
        for(int i = 2; i <= num; i ++)
            ans = (ans * i) % (long)(1e9 + 7);
        return ans;
    }
}

题:剑指 Offer 49. 丑数

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

说明:

1 是丑数。
n 不超过1690。

解:

解题思路:动态规划

AC代码:

class Solution {
    public int nthUglyNumber(int n) {
       int a = 0, b = 0, c = 0; // 三指针 
       int[] dp = new int[n]; // 存储第几个丑数
       dp[0] = 1;
       for(int i = 1; i < n; i ++) {
           dp[i] = Math.min(dp[a] * 2, Math.min(dp[b] * 3, dp[c] * 5));
           // 判断a,b,c的贡献
           if(dp[a] * 2 == dp[i]) a ++;
           if(dp[b] * 3 == dp[i]) b ++;
           if(dp[c] * 5 == dp[i]) c ++;
       }
       return dp[n - 1]; 
    }
}
相关文章
|
JavaScript 前端开发 Java
|
机器学习/深度学习 人工智能 Unix
《人工智能技术与应用》试题与练习(2)
《人工智能技术与应用》试题与练习(2)
332 0
|
12月前
|
存储 Serverless 数据库
通义灵码与阿里云的融合实践
本文探讨了通义灵码与阿里云的融合实践,涵盖生成在阿里云上部署应用的代码及与阿里云服务的深度集成,如云服务器创建、云数据库配置、云存储设置及函数计算服务等,显著提升开发效率和应用灵活性。
通义灵码与阿里云的融合实践
|
前端开发 JavaScript 开发者
React 事件处理机制详解
【10月更文挑战第23天】本文介绍了 React 的事件处理机制,包括事件绑定、事件对象、常见问题及解决方案。通过基础概念和代码示例,详细讲解了如何处理 `this` 绑定、性能优化、阻止默认行为和事件委托等问题,帮助开发者编写高效、可维护的 React 应用程序。
510 4
|
11月前
|
人工智能 运维 架构师
开始报名,龙蜥社区系统运维联盟MeetUp暨iAutoBASE专题论坛来啦
12月27日,探讨车用基础软件技术及生态发展,欢迎报名。
开始报名,龙蜥社区系统运维联盟MeetUp暨iAutoBASE专题论坛来啦
|
11月前
|
存储 运维 前端开发
同城圈子搭子交友论坛系统/搭建圈子系统的常见问题
需求分析不明确 在系统设计初期,如果未能充分理解目标用户的需求,可能导致系统功能与实际需求脱节,进而影响用户体验。 解决方案:通过市场调研、用户访谈、问卷调查等方式深入了解用户需求,确保系统设计符合用户期望。 技术选型困难 选择合适的技术栈对于系统的稳定性和可扩展性至关重要。技术选型不当可能导致系统性能低下或开发周期延长。 解决方案:根据系统需求、开发团队的技术栈以及未来扩展性等因素综合考虑,选择适合的技术栈。例如,前端可以使用uinapp 等框架,后端可以选择PHP框架,数据库可以选择MySQL等。
364 0
|
移动开发 监控 安全
HTML5 WebSocket详解
**WebSocket** 是一种协议,支持浏览器与服务器间的双向全双工通信。不同于传统的 HTTP 模式,WebSocket 建立持久连接,使服务器能主动向客户端推送数据。本文详细解析 WebSocket 的工作原理、优缺点及应用场景,并提供客户端和服务器端的代码示例。WebSocket 适合实时聊天、在线游戏、数据监控等场景,能显著提升用户体验和应用性能,但需注意其实现复杂性和安全性问题。
|
Java Linux 测试技术
JMeter 介绍与安装
Apache JMeter 是一款基于Java的开源性能和负载测试工具,常用于测试Web应用、Web服务、数据库及其他网络服务的性能。它具备跨平台特性,支持Windows、Mac及Linux系统,并可通过插件进行扩展。JMeter不仅能模拟大量用户访问以测试服务器承压能力,还适用于接口测试,支持分布式部署与UI及命令行操作模式。
|
机器学习/深度学习 人工智能 自然语言处理
人工智能在现实世界中的应用:从理论到实践
【10月更文挑战第8天】人工智能在现实世界中的应用:从理论到实践
533 0
|
监控 安全 机器人
Hunter狩猎者夹子机器人系统开发丨现成案例
区块链系统由无数节点构成,这些节点类似于一台tai.独立工作的计算机,当需要记账的时候,每一个节点都会参与竞争,系统会在一段时间内选出合适的节点来记账,而这个节点就会在数据区块中记录下近期发生的数据变化,记录完成后,节点就会把这个数据区块发送给其他节点,其他节点首先会核实数据,数据无误的话,就会把这个数据区块也放入自己的账本当中,于是系统里的所有节点都拥有一个完全一样的数据区块,即账本。 这种记账方式被称为区块链技术或者分布式总账技术
Hunter狩猎者夹子机器人系统开发丨现成案例