试题C 货物排放

天蓝Sea

关注

阅读 29

2022-05-02

题目链接: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;
} 

精彩评论(0)

0 0 举报