<p>问题是您创建了一个大小为<code>MAX(a)</code>的数组,其中<code>a</code>是您的<code>n</code>编号列表。例如,如果<code>MAX(a) = 10^5</code>,这是低效的</p>
<p>您应该找到另一种方法来检查数字a是否是数字B的倍数,例如<code>A%B == 0</code>(使用模)</p>
<p>尝试删除<code>countSieve</code>并更改<code>countMultiples</code></p>
<pre><code>
def countMultiples(query, numbers):
count = 0
for i in numbers:
if i%query == 0:
count += 1
return count
n=int(input())
numbers = []
for i in range(n):
j=int(input())
numbers.append(j)
q=int(input())
queries = []
for i in range(q):
c=int(input())
queries.append(c)
for i in queries:
print(countMultiples(i, numbers))
</code></pre>
<p><strong>编辑</strong>:</p>
<p>这里有一个优化。首先我搜索数字除数,对于每个除数,我在dict<code>d</code>中增加一个计数器,然后对于查询<code>q</code>I print<code>d[q]</code>,这是n个数字中存在的倍数的确切数量</p>
<p>搜索数<code>n</code>的除数的方法是:我做一个循环,直到<code>n</code>的平方根,然后对于每个除数<code>i</code>,我还加上<code>r = n//i</code></p>
<p>我还使用dict <code>divs</code>来存储每个数字n的除数,以便在我已经找到它们时不会重新计算它们</p>
<p>试试这个(它成功地解决了问题<a href="https://hack.codingblocks.com/app/dcb/938" rel="nofollow noreferrer">https://hack.codingblocks.com/app/dcb/938</a>):</p>
<pre><code>
import math
d = {}
divs = {}
for _ in range(int(input())):
num = int(input())
if num in divs:
for e in divs[num]:
d[e] = d.get(e, 0) + 1
else:
div_list = []
for i in range(1, math.floor(math.sqrt(num)) + 1):
if not num % i:
div_list.append(i)
d[i] = d.get(i, 0) + 1
r = num // i
if (not num % r and r != i):
div_list.append(r)
d[r] = d.get(r, 0) + 1
divs[num] = div_list
for i in range(int(input())):
q = int(input())
print(d.get(q, 0))
</code></pre>
<p><a href="https://i.stack.imgur.com/gD42A.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/gD42A.png" alt="Submission successful"/></a></p>