题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 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 (注意有 1616 位数字)时,总共有多少种方案?
运行限制
最大运行时间:1s 最大运行内存: 256M
解析
代码
法一
def PrimeFactor(n):
res = []
for i in [2,3]:
while n != i:
if n % i !=0:
break
res.append(i)
n //= i
for j in range(1,int(n**0.5//6+2)):
i_1 = 6*j - 1
i_2 = 6*j + 1
for i in [i_1,i_2]:
while n !=i:
if n % i !=0:
break
res.append(i)
n //= i
res.append(n)
return res
vis = PrimeFactor(2021041820210418)
sets = set()
def dfs(row,x,y,z):
if row == len(vis):
sets.add((x,y,z))
return
x *= vis[row]
dfs(row+1,x,y,z)
x //= vis[row]
y *= vis[row]
dfs(row+1,x,y,z)
y //= vis[row]
z *= vis[row]
dfs(row+1,x,y,z)
x,y,z = 1,1,1
dfs(0,x,y,z)
print(len(sets))
法二
n = 2021041820210418
i = 1
a = []
cnt = 0
while i * i <= n:
if n % i == 0:
a.append(i)
if i != n / i:
a.append(int(n / i))
i += 1
for i in range(len(a)):
for j in range(len(a)):
if a[i] * a[j] > n:
continue
for k in range(len(a)):
if a[i] * a[j] * a[k] == n:
cnt += 1
print(cnt)
|