质数判定
小学数学,试除法,\(O(\sqrt n)\)
质数筛
常用有埃氏筛和线性筛。
埃氏筛是去除因子的筛法:每当我们找到一个指数,就把它的倍数都标注为合数。
很明显这种筛法有很多重复,因此诞生了线性筛:去除质因数的筛法。
我们维护一个数组v,记录每个数的最小质因子,对于每个i,如果v[i]=i,显然为质数。
否则,搜每个小于等于v[i]的质数p,显然有v[i*p]=p。
由于每个数只会被访问一次,所以时间复杂度是\(O(n)\)。
求正约数集合
求正约数集合针对不同数据范围有不同思路。
对于求单个n的正约数集合,可以直接采用试除法,根号时间完成。
对于求1~n的正约数集合,试除法不能接受,可以考虑采用倍数法。
显然,包含有某个约数d的数必然是d的倍数,因此只需要遍历的时候标记一遍即可,时间复杂度为log级。
欧拉函数
欧拉函数表示的是1~n中与n互质的数的个数。
则有\(\phi(n)=n*\prod_{p|n}{(p-1)/p}\)(其中p为质数)
证明:
考虑n的所有质因子\(p1,p2,p3...,pm\),对于每一个质因子,在1~n中的倍数个数为n/pk,但是会有重叠,运用容斥原理即可。
UVA10140 Prime Distance
L和R的范围很大,但是R-L相对小,可以考虑从这上面下手。
我们可以预处理出2~\(\sqrt{R}\)的所有素数,然后筛出[L,R]中的素数:
对于每个预处理出来的素数,依次乘以\([L/p,R/p]\)中的整数,得到的必然都是合数。把合数全部标记出来之后剩下的就是质数了。
筛选出质数之后剩下的就很简单了。
3101 阶乘分解
回忆小学奥数中这类问题的解法。
对于1~n的每个质数p,求p的个数?
由于每p个数中必然有一个p的倍数,所以n/p即为\(p^1\)的个数。显然[n/p]/p为\(p^2\)的个数。
那么我们线性筛出所有质数,然后求解即可。复杂度为\(O(nlogn)\)。