尝试找到一种更有效的算法来查找产品小于给定输入的数字对。
尝试使用以下内容:
k = N - 1;
while(k>0)
{
div = N/k;
if(N%k==0)
div--;
ans+=div;
k--;
}
虽然这项工作非常缓慢。有更有效的方法吗?
答案 0 :(得分:2)
请注意,如果两个数字的乘积小于n
,则其中至少有一个小于n
的平方根(通过矛盾证明:否则,两个数的乘积不小于sqrt(n)
不小于n
)。
因此,您可以查看最多a
的所有整数sqrt(n - 1)
,而不是n
以外的所有整数。
对于每个a
,请计算b >= a
的数量a * b < n
。
然后将结果乘以2,以计算您看到的每对(b, a)
对(a, b)
。
之后,减去sqrt(n - 1)
的整数部分,以确保对(a, a)
只计算一次。
例如,当n = 5
时,八个可能的对是(1, 1)
,(1, 2)
,(1, 3)
,(1, 4)
,(2, 1)
,{{ 1}},(2, 2)
和(3, 1)
。对于(4, 1)
,我们有a = 1
,因此我们在答案中加上4。对于1 <= b <= 4
,我们有a = 2
,因此我们在答案中加1。我们得到总和5.用2乘以2减去得到8。
答案 1 :(得分:0)
如果您有多个查询,可以尝试使用递归并应用查找表。
count_all_pairs(n)= count_all_pairs(n-1)+ count_all_pair_factors(n-1)