题目描述:
小蓝有一个超大的仓库,可以摆放很多货物。现在,小蓝有 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 **(注意有 16位数字)**时,总共有多少种方案?
思路:分解出整个数的所有因数,再对所有因数暴力枚举两重循环
#include<stdio.h>
int a(long long a,long long b,long long c)
{
if(a==b==c)//长宽高相同 排列只有一种组合
return 1;
if(a==b&&a!=c||a==c&&a!=b||b==c&&a!=b) //长宽高 任意两个相同排列有3种
return 3;
else
return 6; //长宽高都不相同 排列有6种:3*2*1
}
int main()
{
long long n =2021041820210418;
long long L,W,H;
long long ans=0;
for(L=1;L*L*L<=n;L++) //l是最小的一方
{
if(n%L==0)//小优化
{
for(W=L;L*W*W<=n;W++)//l是第二大的一方,次数多
{
if(n%(L*W)==0)//小优化
{
H=n/L/W;
if(H>=W){
ans+=a(L,W,H);
}
}
}
}
}
printf("%d",ans);
return 0;
}