首页 > 编程语言 >欧拉筛解释(含C++代码)

欧拉筛解释(含C++代码)

时间:2024-10-05 13:50:28浏览次数:9  
标签:prime 合数 int 代码 最小 C++ 质因数 质数 欧拉

int prime[MAXN];//质数列表
bool isPrime[MAXN];//标记是否为质数(0表示是,1表示不是)
int cnt;//prime表长

/*
对于任意合数m,可写作m=p*k(p为m的最小质因子,k为m/p,m、k>1且为整数,k>p(p为最小质因子,k为其它几个质因子相乘,每个质因子都比p大,所以k>p))
*/

//欧拉筛(使每个合数只被其最小质因数筛去,O(n))
void Euler(int n){
    //对于每一个质数p,都一定能枚举倒k*p(因为k>p,外层循环i逐个枚举),所以所有质数m均会被筛掉
    for(int i = 2;i <= n;i++){//枚举k,k=i
        if(!isPrime[i]) prime[++cnt] = i;//如果不是质数,则存入prime数组
        for(int j = 1;j <= cnt;j++){//枚举p,p=prime[j]
            if(prime[j] * i > n) break;//超出n则不需要计算
            isPrime[prime[j] * i] = 1;//标记合数(i从2开始,所以i,prime[j]都大于1)
            if(i % prime[j] == 0) break;
            /*如果i % prime[j] == 0,则i=prime[j] * k(k为整数),记此时的j为t
            对于i * prime[j],均可写为prime[t] * k * prime[j]
            若j < t,则prime[j] < prime[t](质数表是按升序存的(2~n),所以越靠后越大),此时,最小质因数为prime[j]
            若j > t,则prime[j] > prime[t],此时,最小质因数为prime[t],prime[j]此时已不再是最小质因数,所以prime[j] * i应该已经被prime[t]筛去,可以直接结束循环
            */
        }
    }
}

标签:prime,合数,int,代码,最小,C++,质因数,质数,欧拉
From: https://blog.csdn.net/shenshi6666/article/details/142703382

相关文章

  • C++ 命名空间
    概念在C++中,命名空间(namespace)是一种将代码中的标识符(如变量名、函数名、类名等)进行分组和隔离的机制。它可以避免不同代码模块之间的命名冲突,提高代码的可维护性和可移植性。命名空间的定义基本语法为:namespace命名空间名称{//在这里定义变量、函数、类等}例......
  • C++-练习-52
    题目:这个练习让您编写处理数组和结构的函数,下面是程序的框架,请提供其中描述的函数,以完成该程序#include<iostream>usingnamespacestd;constintSLEN=30;structstudent{charfullname[SLEN];charhobby[SLEN];intooplevel;}; intgetinfo(studentpa[],i......
  • vs code如何配置C/C++环境,实现完美运行.c/.cpp文件,以及终端乱码问题
    环境配置在VisualStudioCode(VSCode)中安装了C/C++ExtensionPack后,你可以通过以下步骤来运行C++文件:安装编译器配置编译任务:在VSCode中,你可以创建一个编译任务来编译你的C++文件。这通常通过创建一个tasks.json文件来完成。你可以通过以下步骤创建这个......
  • 《代码大全》阅读笔记1(2024.10.4)
    第一章:引言软件构建的艺术:介绍了软件开发的复杂性,以及编写高质量代码的重要性。强调了良好的编码习惯不仅能提高代码的可读性和可维护性,也能降低后期的开发成本。第二章:软件构建的哲学质量的重要性:讨论了软件质量的定义,强调高质量软件不仅包括功能的正确性,还包括可维护性、......
  • 南沙C++信奥赛陈老师解一本通题: 1828:【02NOIP提高组】均分纸牌
    ​ 【题目描述】有n堆纸牌,编号分别为 1,2,…,n。每堆上有若干张,但纸牌总数必为nn的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1的堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 n 的堆上取的纸牌,只能移到编号为n−1的堆上;其他堆上取的纸牌,可以移到相......
  • 代码源 2024 Day 7 ~ 9
    Day7/2024-10-02开T1,发现\(n\le16\),感觉是个状压DP状物,但是手玩了半天还不会,写了个\(30\)pts的爆搜。T2,感觉应该是有规律的,但是并没有细推,也没有打个表看看,最后只会\(5\)pts的BFS爆搜。T3,删边,似乎没有多少时间了,写了\(20\)pts的DFS爆搜。T4,邻域查询,感觉......
  • 1.1第一个C++程序
    1.启动Dev-C++        启动界面如图所示:2.新建源代码        单击文件[F]——新建[N]——源代码[S]3.输入代码        在右侧编辑区输入以下代码#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"HelloWorld!"<<endl;......
  • 代码源CSP-S模拟赛Day7-9赛后总结
    代码源CSP-S模拟赛Day7-9赛后总结Day7赛时先扫一遍题,T1显然数位dp,感觉放在T1应该不难,而且题面有一种很亲切的感觉,感觉很可做。T2简单思考一下发现最终合成的数就是\(a_1\),\(a_2\),\(a_3\)……,\(a_n\)这n个数填正负号再加上一个k的倍数,估计会有一些比较智慧的手法,感觉很......
  • 代码随想录算法训练营day3|● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表
    学习资料:https://programmercarl.com/链表理论基础.html#链表的类型可设置虚拟头结点dummy_head链表最后指向Null一个节点包含值和索引学习记录:203.移除链表元素(基本ListNode(),cur.next,cur.next.val)点击查看代码#Definitionforsingly-linkedlist.#classListNod......
  • Python 高级编程:深入探索高级代码实践
    在Python编程的世界中,掌握高级概念和技术是提升编程能力的关键。本文将带领您深入探索Python的高级特性,通过实际的代码示例展示其强大之处。 1.装饰器(Decorators)装饰器是Python中非常强大的特性,它可以在不修改函数源代码的情况下,为函数添加额外的功能。以下是一个简单......