【线性筛法的应用】

By qw:http://blog.csdn.net/a2520123/article/details/7906407


线性筛法最基础的功能就是求[1,n]中的素数,以此为基础,可以对他进行一些变形。变形后的线性

筛法可以实现许多其他的功能。(下文中的tot均指一定区间内的质数个数)

         先看一道简单的问题:求[1,n]中的m个数的最大质因子的序数(hdoj2136)
         这个问题可以利用线性筛法打一个质数表,然后二分答案,复杂度为O(n+mlog(tot))。
         然而,如果m很大,算法必然会超时。我们可以对线性筛法进行一些变形,每次筛掉一个合数时,
         可以通过他的两个约数推出他的最大质因子。这样可以得到一个O(maxn+m)的算法。

同样的,每次筛掉一个合数时,也可以记下他的最小质因子,这样就可以在log(n)以内的时间内
给出一个数的质因数分解,也就可以同时求出phi(n)的值。
         再看一道问题:求出n!的质因数分解,输出为若干行,每行第一个数为一个质数,第二个数为它的次
数,时间限制为两秒。(n<=10^7)
         这道题很容易想到非线性的做法,即按以上的方法筛一遍,再一个一个的求质因数分解,最后加起
来。原题的数据范围是3*10^6,用好一点的实现的话完全是可以过的。但是,这道题数据范围更大,经测试
这种算法在我的电脑上需要2.5s以上才跑得出来,我们需要一个更优秀的算法。
         筛法已经是线性的了,算法的瓶颈在于分解质因数。
         分析一下算法一分解质因数的过程:对一个数k分解质因数时,每次找到他的最小质因数s,然后
k div s,继续分解。我们发现,每次k都变成一个更小的合数,而这个合数本身在后面还要分解一次!!!
也就是说,对于k和2k,分解2k的时候把k也分解了一次,这是冗余的!!!
         由于k*(s*k)的质因数分解等于k^2的质因数分解加上s的质因数分解,因此我们可以构造一个线性
算法。开一个数组b,初值赋为1。令指针i从后往前扫,每次扫到一个数k,若k是质数,跳过他。否则我们
可以知道k=s*(k div s),b[s]=b[k]+b[s];b[k div s]=b[k div s]+b[k]。这样,我们就可以在线性时间内
求出n!的质因数分解了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值