质因数分解

acwing的最基础模板 https://www.acwing.com/blog/content/406/
知乎大佬给的各种数据范围模板大全:https://zhuanlan.zhihu.com/p/591377294
对于其中的一部分进行提炼形成自己的模板
1.使用场景:假设有n个数需要分解,每个数最大可能是N,下面给出的这种代码的时间复杂度是O(nlogN)
思想:通过O(n)线性筛预处理过程中记录范围内每个数的最小质因数,分解时每个数的最多被计算O(logN)次。

//预处理: for (int i = 2; i < N; i++)minp[i] = i;//通过这个初始化省下bool数组空间 int cnt = 0; for (int i = 2; i < N; i++) { if (minp[i] == i) prime[cnt++] = i; for (int j = 0; j < cnt && prime[j] * i < N; j++) { minp[prime[j] * i] = prime[j]; if (i % prime[j] == 0) break; } } //分解阶段 while (num != 1) { int p = minp[num]; // work,题目具体逻辑 num /= p; }

关于线性筛,知道了一年,说说我的理解.
对于break条件:我们举例子为了让每个数只被自己的minp筛掉,30只能在i=15,prime[j]=2的时候被标记。
而在这之前会经历i=10,但由于10%20,30不会被i=10,prime[j]=3的时候筛掉,因为prime[j]=2的时候f循环就会break
关于原理证明:
我们还是举例子来理解:
比如i=91,我们可以用它能标记912,913.....916,917.
以273为例,91不能整除3且当前还在循环中说明3是91*3的minp.
1.因为从小到大枚举的所有质数,所以当”i%primes[j]!=0”时,primes[j]一定小于i的最小质因子,
primes[j]一定是primes[j]i的最小质因子.
2.因为是从小到大枚举的所有质数,所以当”i%primes[j]
0”时,primes[j]一定是i的最小质因子,
而primes[j]又是primes[j]的最小质因子,因此primes[j]是i*primes[j]的最小质因子.


__EOF__

本文作者爱飞鱼
本文链接https://www.cnblogs.com/mathiter/p/17773406.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   potential-star  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示