求一个数的四个因式,使它们的乘积最大,且它们的和为原数

Find four factors of a number such that their product is maximum and their sum is the original number

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

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

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

在社论中,它已使用单位分数解决,但我无法理解该算法(如果您无法打开上面的内容,我在下面提供了社论link, 标有 ***) 的地方我看不懂。蛮力解决方案导致 TLE(超出时间限制)。请提供使用DFS或回溯的算法或伪代码。

我的蛮力法:- 计算一个数'n'的因式,时间复杂度O(sqrt(n)),存入数组,然后遍历数组得到A,B,C,D使用四个 for 循环。但是对于 T(1<=T<=40000) 个测试用例,它得到 TLE。

编辑(如果你打不开上面link):-

考虑方程 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 是测试用例的数量。

*** 如果我们需要把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开始。)

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