找出一个数字的四个因数,使它们的乘积最大,并且它们的和为原始数

时间:2020-03-30 16:14:38

标签: algorithm recursion depth-first-search number-theory

给定测试用例T的数量和整数N,您需要找到四个整数A,B,C,D,使它们都是N(A | N,B | N,C | N, D | N),并且N = A + B + C + D。目标是最大化A * B * C *D。如果不可能找到这四个因子,则只需返回-1。

问题的输入格式为:
第一行包含一个整数T(1 <= T <= 40000),代表测试用例的数量。
接下来的T行中的每行都包含一个整数N(1 <= N <= 40000,N ^ 4不会超过64位整数)。

此问题位于递归类别下的Hackerearth上,但是我无法理解社论中的算法(社论链接:-https://www.hackerearth.com/practice/basic-programming/recursion/recursion-and-backtracking/practice-problems/algorithm/divide-number-a410603f/editorial/)。

在社论中,它已使用单位分数解决,但我无法理解算法(如果您无法打开上述链接,我在下面提供了社论,我没有能够理解标有***的点)。暴力破解导致TLE(超过时间限制)。请使用DFS或回溯提供算法或伪代码。

我的蛮力方法:-计算O(sqrt(n))中数字'n'的因数并将其存储在数组中,然后使用四个for循环遍历数组以获得A,B,C,D 。但是对于T(1 <= T <= 40000)测试用例,它会获得TLE。

编辑(如果您无法打开上面的链接):-

考虑方程N = A + B + C + D,如果将方程除以N,则得到1 = 1 / A'+ 1 / B'+ 1 / C'+ 1 / D',这里A ',B',C',D'都是整数,因为A,B,C,D是N的因数。

因此,原始问题等于将1分为四个单位分数。

我们可以列举从大到小的单位分数。

***如果需要将X划分为Y个单位分数,最后一个单位分数是1 / Z,我们可以枚举1 / Z和X / Y之间的单位分数(因为我们正在枚举最大的剩余分数) ,然后递归求解。

***找到1 = 1 / A'+ 1 / B'+ 1 / C'+ 1 / D'的所有解(如果按顺序排列,大约有20个解),我们可以在每个解中进行列举测试用例。如果A',B',C',D'都是N的因子,我们可以使用此解决方案来更新答案。

时间复杂度:O(T),其中T是测试用例的数量。

2 个答案:

答案 0 :(得分:0)

***如果需要将X划分为Y个单位分数,最后一个单位分数是1 / Z,我们可以枚举1 / Z和X / Y之间的单位分数(因为我们正在枚举最大的剩余分数) ,然后递归求解。

答案:我们正在尝试找出1 = 1 / A + 1 / B + 1 / C + 1 / D的所有组合。最初,我们有X = 1和Y = 4,并且我们将A视为最大因子,该因子应不小于X / Y = 1/4。因为这是第一个元素,所以没有最后一个分数1 / Z。假设我们选择A = 3,那么最后一个分数1 / Z是1 / A = 1/3,并且X = 1-1 / 3 = 2/3,并且Y = 3。现在我们将从[X / Y,1 / Z] = [2/9,1/3]中选择1 / B。并为下一步做同样的事情。

***找到1 = 1 / A'+ 1 / B'+ 1 / C'+ 1 / D'的所有解(如果按顺序排列,大约有20个解),我们可以在每个解中进行列举测试用例。如果A',B',C',D'都是N的因子,我们可以使用此解决方案来更新答案。

答案:因为1 / A应该不小于1/4,所以A只能是2、3、4。如果A == 4,那么A = B = C = D,只有一个解。如果A == 3,[X / Y,1 / Z] = [2/9,1/3],那么B只能是3或4,如果B == 4,则下一轮C应该是4,其中[ X / Y,1 / Z] = [5/24,1/4];如果B = 3,则C可以是4,5,6,因为[X / Y,1 / Z] = [1 / 6,1 / 3]。如果A == 2,[X / Y,1 / Z] = [1/6,1/2],则B可以为3、4、5、6。您可以使用代码进行余下的计算,就像我们可以切断许多搜索分支一样。 (忽略我的枚举顺序,您应该从A = 2开始。)

答案 1 :(得分:0)

通过仅使用3 for循环并应用二进制搜索来查找第四个数字,可以提高代码的时间复杂度,因为二进制搜索的时间复杂度为log(n)。 时间复杂度= O(n ^ 3 *(log(n))并根据 问题约束它应该能够通过所有测试用例。