利用深度优先搜索解决《货物摆放》问题

利用深度优先搜索解决《货物摆放》问题

题目描述

小蓝有一个超大的仓库,可以摆放很多货物。

现在,小蓝有 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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都鼓捣的小yao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值