【蓝桥杯】2021真题货物摆放

写在前面

化繁从简是这道题的奥义,别一直死脑筋期望已经超出时间限制的算法给你一个正确的答案,可能会给你一个回复:这样做错误!

货物摆放🗡

题目描述

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

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

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明璐花生牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值