Tyvj P1392 and SHLQSH数总结

本文详细介绍了求解SHLQSH数的四种算法,包括复杂度高导致TLE的直接枚举法,通过质因数分解优化到O(n*m)的算法,使用筛素法进一步优化至O(n)的算法,以及最终通过减少重复计算得到的O(n)优化算法。文章提供了具体代码实现,并讨论了每种算法的时间复杂度和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SHLQSH数总结

SHLQSH数即为求输入的两个数之间约数的个数之和。(数据范围为1~10000000

例如输入2 6

2的约数为:1,2

3的约数为:1,3

4的约数为:1,2,4

5的约数为:1,5

6的约数为:1,2,3,6

所以,从26的约数的个数为2+2+3+2+4=13

 

那么,如何求两个数之间的约数个数呢?现给出4种算法:(设这两个数分别为xy

算法一:

      既然是求两个数之间的约数个数,那么就可以从xy分别枚举每一个数的约数存入数组中,然后不断累加可得答案,时间复杂度为On²),由于复杂度太高,肯定会TLE,故不给出代码。

算法二:

      我们可以把从XY的每一个数进行质因数分解,即分解成p1^a1*p2^a2*p3^a3…*pk^akpi为质数,ai是正数,这样的话,约数的个数就可以表示为(a1+1*a2+1*a3+1*…*ak+1{因为对每一个pi^ai,我们都少了1这个约数,因此要+1},这样的话,复杂度就被我们分解成了On*m),mMaxN以内的质数。

算法三:

       刚才算法二的质数还是太高了,我们还可以采用用筛素法求质数表的方法,求出每个数的约数个数,code如下

 

算法四:

       算法三其实已经很优化了,但时间复杂度依然是ON²),如何把复杂度将为ON)呢

       因为我们要求XY的约数的个数和,那么我们可以只求一遍1~Y的约数个数减1~X-1的约数个数不就是X~Y的约数个数吗。

因此,代码还可以更优化:

 

至此,算法已优化到了ON),对于10000000的数据大小已经完全适用。

 

PS:本文根据NOI导刊2010年第二期《妙解shlqsh问题》改编而来。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值