概述
写在前面
化繁从简是这道题的奥义,别一直死脑筋期望已经超出时间限制的算法给你一个正确的答案,可能会给你一个回复:这样做错误!
货物摆放????
题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 LL、WW、HH 的货物,满足 n = L times W times Hn=L×W×H。
给定 nn,请问有多少种堆放货物的方案满足要求。
例如,当 n = 4n=4 时,有以下 66 种方案: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 = 2021041820210418n=2021041820210418 (注意有 1616 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
运行限制
最大运行时间:1s
最大运行内存: 256M
起初我想的就是直接干脆:
#include <iostream>
using namespace std;
int main()
{
// 请在此输入您的代码
long long ans=0;
for(int i=1;i<=2021041820210418;i++){
for(int j=1;j<=2021041820210418/i;j++){
for(int k=1;k<=2021041820210418/(i*j);k++){
if(i*j*k==2021041820210418)
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
人大无脑地去想,结果嘞,认真看看这个仅仅十几行的代码;时间复杂度达到了2021041820210418^3!!!!,你指望计算机去算吧,编译很快就好了,如果使用双核2.0的CPU做例子一秒可以算2×2×1024×1024×1024=4294967296次,而2021041820210418^3也就算做是10^48(大概)转换成二进制就是一个1010111100101001100011010000010100001110010000111001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000得让计算机算个很长时间(但是考试时间就这么点,确定全去运行这个填空题?很显然并不能,说不定算到一半你的电脑罢工了hhh)
所以得选一条简单让计算机可以快速算出结果的方法(降复杂度,太大了,计算机表示看到就恁恶心)
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int main()
{
// 请在此输入您的代码
long long num=2021041820210418;
//其实为什么我们那样去想,因为那样去想最简单,最不费脑子。但是我们发现那种方法很多组都是无效的,也就是出现不是num因子的数字出现
//因此这样的计算毫无意义反而给我们的CPU增加负担;
//好,简化的目的摆明了,找num的因子呗~
//但是我们事先不知道num到底有多少因子,因此这里可以设置一个vector容器,产生一个就压进vector容器里
vector<long long> divisor;//因为因子也可能是num本身,所以咱们的因子容器设置为long long类型的
//我们开始找因子,只需要找到num的平方根即可,因为如果再往后找的话,就找到之前小于num平方根的i除得的num中对应于i的较大的因子;
//这里对于较大的因子我们可以通过循环里的j得到
for(long long i=1;i<=sqrt(num);i++){
if(num%i==0){
divisor.push_back(i);
long long j=num/i;
if(j!=i){
divisor.push_back(j);//如果是因子就将因子压入因子容器里
}
}
}
//设置好题解是count初值为0
int count=0;
//设置三个迭代器遍历因子容器找三个因子相乘就是num的组合,答案就在这些组合里面
vector<long long>::iterator a,b,c;
for(a=divisor.begin();a!=divisor.end();a++){
for(b=divisor.begin();b!=divisor.end();b++){
for(c=divisor.begin();c!=divisor.end();c++){
if((*a)*(*b)*(*c)==num){
count++;
}
}
}
}
cout<<count<<endl;//输出结果,问题结束!
return 0;
}
最后
以上就是着急树叶为你收集整理的【蓝桥杯】2021真题货物摆放写在前面货物摆放????的全部内容,希望文章能够帮你解决【蓝桥杯】2021真题货物摆放写在前面货物摆放????所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复