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

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

一、概念

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]; 
    }
}
相关文章
|
17天前
|
关系型数据库 MySQL Java
分布式事务终极指南:2PC/XA/TCC/SAGA 从底层原理到生产选型全拆解
本文系统解析分布式事务四大主流方案:XA/2PC(强一致但性能差)、TCC(高并发柔性事务)、SAGA(长事务最终一致)及理论基石(ACID/CAP/BASE),涵盖原理、流程、实战代码、优劣对比与生产选型标准,助你深入掌握核心逻辑。
448 3
|
3月前
|
安全 算法 项目管理
日期计算器在线工具分享
这是一款基于Vue3开发的免费在线日期计算器,支持日期加减、天数差值、工作日计算及星期查询。界面简洁、操作便捷、结果精准,所有计算均在本地完成,保障隐私安全,无需注册即可跨设备使用。
903 4
日期计算器在线工具分享
|
自然语言处理 数据格式
【DSW Gallery】基于ModelScope的中文GPT-3模型(1.3B)的微调训练
本文基于ModelScope,以GPT-3(1.3B)为例介绍如何使用ModelScope-GPT3进行续写训练与输入输出形式的训练,训练方式不需要额外指定,训练数据集仅包含 src_txt 时会进行续写训练,同时包含 src_txt 和 tgt_txt 时会进行输入输出形式的训练。
【DSW Gallery】基于ModelScope的中文GPT-3模型(1.3B)的微调训练
|
前端开发 JavaScript 程序员
|
9月前
|
人工智能 自然语言处理 大数据
互联网医院智能导诊系统的技术实现原理
互联网医院智能导诊系统利用人工智能与大数据技术,通过自然语言处理、医学知识图谱、多模态交互等技术,实现患者症状的智能识别与科室匹配,提升挂号效率与准确率,优化就医流程。
493 10
创造与魔法脚本,炉石传说脚本,碧蓝航线脚本开源代码
主脚本包含三个游戏自动化模块:创造与魔法(资源采集/任务)、炉石传说(自动天梯)、碧蓝航线(委托/战斗)
|
Web App开发 弹性计算 安全
如何将自己的网站上传到阿里云服务器
部署,服务器,上传,阿里云,网站
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之mysql cdc支持全量的时候并发读取,该如何配置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
阿里云百炼商业化升级公告
阿里云百炼大模型于2024年3月15日完成商业化升级,本次商品升级后不影响计费价格,调用方式和服务也不会改变和中断,无需手动操作。
674 10