0x30 数学知识

质数判定

小学数学,试除法,\(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)\)

转载于:https://www.cnblogs.com/ilverene/p/11166896.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值