9.有9个因数的数

有9个因数的数
Description
Find the count of numbers less than N having exactly 9 divisors

1<=T<=1000,1<=N<=10^12

Input
First Line of Input contains the number of testcases. Only Line of each testcase contains the number of members N in the rival gang.

Output
Print the desired output.

Sample Input 1
2
40
5

Sample Output 1
1
0

注:该方法提升性能的关键点:
1)质数集合只初始化一次,即放在for循环外面
2)for i in range(2, len(init))语句中使用len(init)比使用pow(10,6)省400ms左右的时间
3)直接在main函数中编写,不定义额外的方法.本人一般做法会将number和质数集合l放在main函数外部方法处理,发现会超时.
3)初始化init函数,使用[0]*pow(10,6)比使用[0 for I in range(pow(10,6))]省几十ms时间

思路来自于年糕糕糕

这个题还有其他的方法,可以使用python耗时100多ms解决,还没有总结.

if __name__ == '__main__':
    n = int(input())
    # 获得小于10^6的质数集合,不能放在for循环或solution函数中,这样每次都初始化质数集合,会超时
    l = []
    init = [0] * pow(10, 6)
    # init = [0 for i in range(pow(10, 6))]
    init[0], init[1] = 1, 1
    for i in range(2, len(init)):
        # 将质数放入集合中
        if init[i] == 0:
            l.append(i)
        for j in l:
            if i * j >= len(init):
                break
            init[i * j] = 1
            # 假设i = a * j,j<j_next(质数集合中j的下一个数)
            # 则init[i*j_next] = init[a*j*j_next] = init[a*j_next*j]
            # 则可以等到i=a*j_next,内质数循环遍历到j是,将该数置为1。使得复杂度为O(n)
            if i % j == 0:
                break
    for i in range(n):
        number = int(input())
        # 结果
        res = 0
        # 取满足条件number = A^2*B^2的个数
        for m in range(len(l)):
            if pow(l[m] * l[m + 1], 2) >= number:
                break
            for n in range(m + 1, len(l)):
                if pow(l[m] * l[n], 2) >= number:
                    break
                else:
                    res += 1

        # 加上满足条件number = A^8的个数
        for k in l:
            if k > 31:
                break
            elif pow(k, 8) < number:
                res += 1
            else:
                break
        print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值