[蓝桥杯练习]试题:货物摆放

题目

小蓝有一个超大的仓库,可以摆放很多货物。

现在,小蓝有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;
}

答案:

AC:

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值