当前位置: 首页 > news >正文

埃氏筛及扩展质因数筛——埃拉托斯特尼筛法变种

  质数筛

这段代码用 “埃拉托斯特尼筛法” 找 2 到 N 之间的所有素数,逻辑很直接:
 
  1. 先假设所有数都是素数(用vis数组标记,初始全为true);
  2. 排除 0 和 1(它们不是素数,标记为false);
  3. 从 2 开始,对每个没被排除的数 i(说明 i 是素数),把它的所有倍数(从 i×i 开始)都标记为非素数(因为素数的倍数一定不是素数);
  4. 最后把所有没被标记为非素数的数(即素数)收集到prime数组里,统计个数。
 
这样就能高效找出所有素数。
查看代码
const int N = 2e5 + 5;
int prime[N];//存储素数
bool vis[N];//埃拉托斯特尼筛法(质数筛)
void sieve(){memset(vis, true, sizeof(vis));vis[0] = vis[1] = false;for(int i = 2; i * i <= N; ++i){if(vis[i]){for(int j = i * i; j <= N; j += i){vis[j] = false;}}}int cnt = 0;for(int i = 2; i <= N; ++i){if(vis[i]) prime[++cnt] = i;}return ;
}

质因数筛

这段代码的作用是找出 1到N 之间每个数的所有质因数,并把每个数的质因数存到fac数组里(比如fac[6]会存[2,3],因为 2 和 3 是 6 的质因数)。
 
逻辑很简单:
 
  • 从 2 开始逐个检查数字i,如果fac[i]是空的,说明i是素数(没被更小的数标记过)。
  • 对这个素数i,把它的所有倍数(从i本身开始,比如i=2时,倍数是 2、4、6、8…)的质因数列表里都加上i(因为i是素数,它的倍数一定包含i作为质因数)。
 
这样最后fac[j]里就有j的所有质因数了。
查看代码
const int N = 2e5;
vector<vector<int>> fac(N);void sieve(){for(int i = 2; i <= N; ++i){if(!fac[i].empty()) continue;for(int j = i; j <= N; j += i){fac[j].emplace_back(i);}}
}
http://www.zskr.cn/news/28797.html

相关文章:

  • 2025.10.23
  • xcode程序创建文件存储位置
  • 欧拉操作系统搭建docker
  • NXP S32K118的FTM模块分析
  • 20232417 2025-2026-1 《网络与系统攻防技术》实验二实验报告
  • 写电商详情页不用挠头了:一个还算实用的AI指令模板
  • 一些题解
  • 梦熊知更鸟赛水题题解合集 (两个人的演唱会 使一颗心免于哀伤 空气蛹)
  • CF2154D
  • 第十九天
  • 第十八天
  • [优先队列] P3611 [USACO17JAN] Cow Dance Show S 题解
  • 搜维尔科技将携手Xsens|Haption|Tesollo|Manus亮相IROS 2025国际智能机器人与系统会议
  • 处理空输入踩的坑
  • 66页实验题
  • 简单云计算算法--20251023
  • latex输入公式
  • 10.23《程序员修炼之道 从小工到专家》第二章 注重实效的途径 - GENGAR
  • 树状数组求逆序对
  • ExPRT.AI如何预测下一个将被利用的漏洞
  • AI元人文构想的跨学科研究:技术实现与人文影响分析——对自由与责任的再框架化(DeepSeek基于Ai元人文系列文章研究)
  • 日总结 16
  • 解码Linux文件IO之库的制作与应用
  • 20251023 正睿二十连测
  • 日志分析-IIS日志分析
  • Visual Studio 插件 - 喝水提醒 - 指南
  • 10/23
  • 玛哈特十一辊矫平机:把金属板送进“11 次节拍器” - 教程
  • 第3天(中等题+简单题 数组、滑动窗口)
  • ollama v0.12.2 版本更新详解:Qwen3 架构协助、Multi-Regex 分词器、新引擎前后缀匹配等功能升级