题目链接:https://www.lanqiao.cn/courses/2786/learning/?id=280825
题目答案:2430
题目解析:
切入点是 n = L * W * H
分别用i,j,k表示L,W,H,根据对称性可设:i <= j <= k;
可得i满足的条件: i >= 1 && i * i * i <= n && n % i == 0
j满足的条件:j >= i && i * j * j <= n && (n / i) % j == 0
k满足的条件:k >= j
而对于组合(i, j, k),
当各不相同时,有6种情况;
当有且只用两个相同时,有3种情况;
当都相同时,有1种情况
组合乘上对应情况再累加即可。
代码:
//#define local
#include<cstdio>
#include<iostream>
#include<vector>
typedef long long ll;
using namespace std;
ll n;
// 组合对应的情况数
int num[3]={6,3,1};
int count(ll a,ll b,ll c){
if((a!=b)&&(b!=c)&&(c!=a))
return 0;
else if((a==b)&&(b==c)&&(c==a))
return 2;
else
return 1;
}
int main(){
#ifdef local
freopen("data.in","rb",stdin);
//freopen("data.out","wb",stdout);
#endif
ll ans=0;
scanf("%lld",&n);
for(ll i=1;i*i*i<=n;++i){
if(n%i==0)
for(ll j=i;i*j*j<=n;++j){
if((n/i)%j==0){
ll k=n/(i*j);
if(k>=j)
ans+=num[count(i,j,k)];
}
}
}
cout<<ans;
return 0;
}