SHLQSH数总结
SHLQSH数即为求输入的两个数之间约数的个数之和。(数据范围为1~10000000)
例如输入2 6
2的约数为:1,2
3的约数为:1,3
4的约数为:1,2,4
5的约数为:1,5
6的约数为:1,2,3,6
所以,从2到6的约数的个数为2+2+3+2+4=13个
那么,如何求两个数之间的约数个数呢?现给出4种算法:(设这两个数分别为x,y)
算法一:
既然是求两个数之间的约数个数,那么就可以从x到y分别枚举每一个数的约数存入数组中,然后不断累加可得答案,时间复杂度为O(n²),由于复杂度太高,肯定会TLE,故不给出代码。
算法二:
我们可以把从X到Y的每一个数进行质因数分解,即分解成p1^a1*p2^a2*p3^a3…*pk^ak,pi为质数,ai是正数,这样的话,约数的个数就可以表示为(a1+1)*(a2+1)*(a3+1)*…*(ak+1){因为对每一个pi^ai,我们都少了1这个约数,因此要+1},这样的话,复杂度就被我们分解成了O(n*m),m为MaxN以内的质数。
算法三:
刚才算法二的质数还是太高了,我们还可以采用用筛素法求质数表的方法,求出每个数的约数个数,code如下
算法四:
算法三其实已经很优化了,但时间复杂度依然是O(N²),如何把复杂度将为O(N)呢
因为我们要求X到Y的约数的个数和,那么我们可以只求一遍1~Y的约数个数减1~X-1的约数个数不就是X~Y的约数个数吗。
因此,代码还可以更优化:
至此,算法已优化到了O(N),对于10000000的数据大小已经完全适用。
PS:本文根据NOI导刊2010年第二期《妙解shlqsh问题》改编而来。