有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)