小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 nn箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 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 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当 n = 2021041820210418 (注意有 16 位数字)时,总共有多少种方案?
思路:
从n的所有约数中找3个数(可重复)乘积为n的个数
求所有约数:
vector<int>yue;
for(int i=1;i*i<=n;i++){
if(n%i==0){
yue.push_back(i);
if(n/i!=i) yue.push_back(n/i);
}
}
#include<iostream>
#include<vector>
using namespace std;
typedef long long LL;
int main(){
LL n=2021041820210418;
vector<LL>d;//储存n的所有约数
for(LL i=1;i*i<=n;i++){
if(n%i==0){
d.push_back(i);
if(n/i!=i)d.push_back(n/i);
}
}
int ans=0;
vector<LL>::iterator a,b,c;
for(a=d.begin();a!=d.end();a++){
for(b=d.begin();b!=d.end();b++){
for(c=d.begin();c!=d.end();c++){
if((*a)*(*b)*(*c)==n){
ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}