Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 乘积小于给定数的数对数_C_Algorithm - Fatal编程技术网

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代码集有关。引用他们的话,“在任何其他平台上进行的比赛中,无论在线还是离线,不要询问或讨论任何编解码器问题的任何方面。在比赛期间应避免讨论策略,并推迟到比赛结束。”出于良好的体育精神,我将删除我的答案,直到比赛结束。