Acwing 算法基础课 数学知识 线性筛

server/2024/12/16 4:47:05/

线性筛素数

也叫欧拉筛。

int pr[maxn]; bool flg[maxn];
int main() {for (int i = 2; i < maxn; ++i) {if (!flg[i]) pr[++pr[0]] = i;for (int j = 1; i * pr[j] <= n && j <= pr[0]; ++j) {flg[i * pr[j]] = 1;if (i % pr[j] == 0) break; // 重点}}
}

这样筛的话,若合数 n = p 1 a 1 p 2 a 2 ⋯ p k a k n = p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k} n=p1a1p2a2pkak p 1 < p 2 < ⋯ < p k p_1 < p_2 < \cdots < p_k p1<p2<<pk),则 n n n 会在 i = n p 1 , p r [ j ] = p 1 i = \frac{n}{p_1}, pr[j] = p_1 i=p1n,pr[j]=p1 处被筛去,也只会在这里被筛去。也就是说,每个数都会被它最小的质因子筛去。if(i%pr[j]==0)break; 这句话保证了复杂度。

将合数分解为 n = p ∗ i n = p*i n=pi p p p n n n 最小的质因子),
相当于 n = p ∗ ( p 1 a 1 − 1 p 2 a 2 ⋯ p k a k ) n=p*(p_1^{a_1-1} p_2^{a_2} \cdots p_k^{a_k}) n=p(p1a11p2a2pkak) i = p 1 a 1 − 1 p 2 a 2 ⋯ p k a k i=p_1^{a_1-1} p_2^{a_2} \cdots p_k^{a_k} i=p1a11p2a2pkak
如果 p ∤ i p \nmid i pi,则构造合数n被筛掉
如果 p ∣ i p \mid i pi ,表示 p = p 1 p = p_1 p=p1,是 i i i 的最小质因子,需要构造n后停止循环。

  • 如果继续用质数表中大于 p 1 p_1 p1 的后面的质数 p j p_{j} pj 构造 n j n_j nj j > 1 j>1 j>1
    设当前 i j = p 1 a 1 p 2 a 2 ⋯ p j a j − 1 ⋯ p k a k i_j=p_1^{a_1} p_2^{a_2} \cdots p_{j}^{a_{j}-1} \cdots p_k^{a_k} ij=p1a1p2a2pjaj1pkak,则 n j = p j ∗ i j = p 1 a 1 p 2 a 2 ⋯ p j a j ⋯ p k a k n_j = p_j*i_j = p_1^{a_1} p_2^{a_2} \cdots p_{j}^{a_{j}} \cdots p_k^{a_k} nj=pjij=p1a1p2a2pjajpkak
  • 之后当 i x = p 1 a 1 p 2 a 2 ⋯ p x a x − 1 ⋯ p k a k i_x=p_1^{a_1} p_2^{a_2} \cdots p_{x}^{a_x-1} \cdots p_k^{a_k} ix=p1a1p2a2pxax1pkak x < j x<j x<j i x > i j i_x>i_j ix>ij),与 p x p_x px构造合数 n x n_x nx n x = p x ∗ i x = p 1 a 1 p 2 a 2 ⋯ p k a k = n j n_x=p_{x}*i_x= p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k} = n_j nx=pxix=p1a1p2a2pkak=nj。故需提前break
  • 直观点看,i小 * p大 == i大 * p小的数(i大会在i小之后出现)
    例如
    i=6=2 * 3 * 3 18
    i = 9 = 3 * 3 * 2 18

具体的严谨证明详见初等数论的容斥原理


http://www.ppmy.cn/server/150530.html

相关文章

ubuntu24.04部署单节点kafka_2.13-3.8.1

ubuntu24.04部署单节点kafka_2.13-3.8.1 下载地址推荐使用清华镜像源下载 https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.8.1/kafka_2.13-3.8.1.tgz 部署kafka部署 # 解压kafka压缩包 sudo tar -zxvf kafka_2.13-3.8.1.tgz -C /usr/local/# 改变权限及所有权 sudo ch…

【软件工程】第六章·考虑对象(UML、UML在软件开发中的应用、面向对象方法的软件开发)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;软件开发必练内功_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

TDengine Flink集成

Flink 集成 TDengine 主要涉及在 Flink 项目中配置与 TDengine 的连接&#xff0c;实现数据的读取和写入。以下是一个详细的指南&#xff0c;介绍如何在 Flink 中集成 TDengine&#xff1a; 一、准备工作 安装并启动 Flink&#xff1a; 下载并解压 Flink 安装包。启动 Flink …

MacOs 日常故障排除troubleshooting

1. 关闭开机自启动 app X macOs 15.1 System settings -> General -> Login Items & Extensions->Open at Login -> Select app X and click -

Nginx 缓存那些事儿:原理、配置和最佳实践

Nginx 缓存那些事儿&#xff1a;原理、配置和最佳实践 在当今的互联网世界&#xff0c;网站的访问量和数据处理量不断攀升&#xff0c;如何确保用户能够快速、稳定地访问我们的网站&#xff0c;已经成为每个运维工程师面临的挑战。幸运的是&#xff0c;Nginx 作为一款高性能的…

C语言:const的用法

有时候我们希望定义这样一种变量&#xff0c;它的值不能被改变&#xff0c;在整个作用域中都保持固定。例如&#xff0c;用一个变量来表示班级的最大人数&#xff0c;或者表示缓冲区的大小。为了满足这一要求&#xff0c;可以使用 const 关键字对变量加以限定&#xff1a; con…

交换瓶子(图论 贪心)

1224. 交换瓶子 - AcWing题库 把每一个瓶子看成一个点&#xff0c;从每个瓶子向他应该在的那个位置的瓶子连一条边 通过这个方式&#xff0c;我们就可以连出n条边 观察可以发现这些图有特点&#xff1a; n个点 连成n条边 因为每个点会指向它应该在的位置的那个点&#xff…

Rust学习路线图

‌Rust是一种现代的系统编程语言&#xff0c;专注于性能、安全性和并发性。它在没有垃圾回收器的情况下实现了这些目标&#xff0c;使其成为许多其他语言不擅长的用例中的有用语言。其语法与C相似&#xff0c;但Rust在保持高性能的同时提供了更好的内存安全性。 获取路线图 你…