题目
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆L、W、H 的货物,满足n=LxWxH。
给定 n,请问有多少种堆放货物的方案满足要求。
例如,当n=4时,有以下6种方案:1x1x4、1x2x2、1x4x1、2x1x2、2x2x1、4x1x1。
请问,当n=2021041820210418(注意有 16 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
难点分析
想要解决此问题,在求有多少种堆放货物的方案满足要求时我们可以利用三层循环遍历给出的n,即(d[i] * d[j] * d[z] == n)。然而问题是这样的遍历法会超时无法得出,所以我们要优化给出的n=2021041820210418。我们可以找出n的所有因子并存储到数组d,这样就可以只遍历因子,同时取n开平方在其中查找因子,因为平方前的因子和平方后的因子相同,节省计算数量。
代码实现
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define int long long
signed main() {
vector<int>d;
int n = 2021041820210418;
//找出的n的所有因子存储起来,进而针对枚举范围进行优化
for (int i = 1; i < sqrt(n); i++) {
if (n%i == 0) {
d.push_back(i);
if (i != n / i) {
d.push_back(n / i);
}
}
}
//枚举三个位置上的数字,计算方案数
int ans=0;
for (int i = 0; i < d.size(); i++) {
for (int j = 0; j < d.size(); j++) {
for (int z = 0; z < d.size(); z++) {
if (d[i] * d[j] * d[z] == n) {
ans++;
}
}
}
}
cout << ans << endl;
return 0;
}