产品小于给定数量的数字对数

时间:2014-04-05 13:30:19

标签: c algorithm

尝试找到一种更有效的算法来查找产品小于给定输入的数字对。

尝试使用以下内容:

                k = N - 1;
        while(k>0)
        {
            div = N/k;
            if(N%k==0)
                div--;
            ans+=div;
            k--;
        }

虽然这项工作非常缓慢。有更有效的方法吗?

2 个答案:

答案 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)