题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足 n=L×W×H。
给定 nn,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4时,有以下 6种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当 n = 2021041820210418(注意有 16 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
1.根据n=L*H*W可以知道,L,H,W都是n的约数,所以这道题的本质是求n的所有约数,最后用三层循环直接求解就行了。因为本题是道填空题,所以超时什么的就无所谓了。
2.什么是约数?
约数又称因数。比如说a/b的余数为0,那么b就是a的约数(因数)。
3.局部优化
虽然最后依旧会超时,但我们可以在求约数的地方优化一下,减少一下代码的运行时间。
比如:求25的所有约数,基础的方法就是从1遍历到25,如果余数为0那么这个数就是约数,但如果像题目的数那么大的话,求个约数都要运行半天。
所以可以把遍历的范围限制到数据的算数平方根,这样的话求约数的时间就大大减少了。在这里要注意的是,除数是约数,商也是约数,有些情况是除数会等于商的(比如25/5除数为5,商也为5),所以用集合来存储约数。
Code:
'''
n=2021041820210418
a=set() #用集合来储存约数,因为集合会自动去重
for i in range(1,int(pow(n,0.5))+1): #这里从1遍历到数据的算数平方根,节省点时间
if n%i==0:
a.add(i) #除数是约数
a.add(n//i) #商也是约数
num=0
for i in a:
for j in a:
for k in a:
if i*j*k==n:
num+=1
print(num)
'''
print(2430)