题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足 n =L×W×H。
给定 n,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 1。
请问,当 n = 2021041820210418(注意有 16 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
解题思路
填空题又不考虑时间限制暴力求解就完了。
虽然我能想到的也只有暴力求解了(如果有巧妙的方法可在评论区对我指指点点)。
首先我们假设长宽高的值为i, j,k(i,j,k并不与长宽高相对应。),且i<=j<=k。
由此我们进行暴力循环。
i 的范围为[1,n**0.3333] 0.333 由i<j<k得来,但是不那么细也没啥问题。
j 的范围为[i, n/i**0.5]
k 的值为n/(i*j)
当然i,j,k均为整数,且在i除n后为整数,这些在循环后判断即可。
代码
n = 2021041820210418
ans = 0
for i in range(1, int(n ** 0.5)):
if n % i == 0:
n1 = n / i
for j in range(i, int(n1 ** 0.5)):
if n1 % j == 0:
k = n1 / j
if k >= j:
if i == j and j == k:
ans += 1
elif i != j and j == k:
ans += 3
elif i == j and j != k:
ans += 3
elif i != j and j != k:
ans += 6
print(ans)