C 乘积小于给定数的数对数
试图找到一种更有效的算法来查找乘积小于给定输入的数对 已尝试使用以下命令:C 乘积小于给定数的数对数,c,algorithm,C,Algorithm,试图找到一种更有效的算法来查找乘积小于给定输入的数对 已尝试使用以下命令: k = N - 1; while(k>0) { div = N/k; if(N%k==0) div--; ans+=div; k--; } 虽然这项工作做得很慢。有没有更有效的方法?注意,如果两个数字的乘积小
k = N - 1;
while(k>0)
{
div = N/k;
if(N%k==0)
div--;
ans+=div;
k--;
}
虽然这项工作做得很慢。有没有更有效的方法?注意,如果两个数字的乘积小于
n
,至少有一个小于n
的平方根(矛盾证明:否则,两个不小于sqrt(n)
的数字的乘积不小于n
)
因此,您可以查看a
到sqrt(n-1)
的所有整数,而不是n
的所有整数。
对于每个a
,计算b>=a
的数量,以便a*b
。
然后将结果乘以2,对您看到的每对(a,b)
进行计数。
然后,减去sqrt(n-1)
的整数部分,以确保对(a,a)
精确计数一次
例如,当
n=5
时,八个可能的对是(1,1)
,(1,2)
,(1,3)
,(1,4)
,(2,1)
,(2,2)
,(3,1)
,(4,1)
。对于a=1
,我们有1,如果您有多个查询,您可以尝试使用递归并应用查找表
count\u all\u pairs(n)=count\u all\u pairs(n-1)+count\u all\u pairs\u factors(n-1)我没有完全理解这个答案:比如我们拿数字5->对是(1,1)(1,2)(1,3)(1,4)(2,1)(2,2)(3,1)(4,1)。现在如果我们取一个数字直到sqrt 5,即1到4,2到2总数=6。现在乘以2我们得到12,减去sqrt(5)我们得到10,但答案是8。这可能是因为我误解了你的答案。您能澄清一下吗?@user3501236:完成。缺失点是我们应该只考虑<代码> b>=a < /代码>。在一些研究中,这个问题似乎与AT代码集有关。引用他们的话,“在任何其他平台上进行的比赛中,无论在线还是离线,不要询问或讨论任何编解码器问题的任何方面。在比赛期间应避免讨论策略,并推迟到比赛结束。”出于良好的体育精神,我将删除我的答案,直到比赛结束。