蓝桥杯2021省赛-货物摆放

408 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目描述

小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足 n=L×W×H。
给定 n,请问有多少种堆放货物的方案满足要求。
例如,当 n=4 时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 1。
请问,当n=2021041820210418 (注意有 16 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。

我的思路:
由于要拆解成因子,拆解的三个因子(设为a,b,c),始终要a<=b<=c,节省时间,否则可能会超时
如果三边相等,即a==b==c,ans+=1;//abc三者相等,为一种情况
如果有两边相等,ans+=3;//abc三个有两个相等,则独立的哪个有三种放法
如果三边都不相等,即a!=b!=c,ans+=6;//abc互不相等,全排列3 * 2 *1种

#include<bits/stdc++.h>
using namespace std;
int main() {
    long long n=2021041820210418;
    long long ans=0; 
    for(long long i=1;i*i<=n;i++) {
        if(!(n%(i*i))) ans+=3; 
    } 
    for(long long a=1;a<=126432;a++) {//126432为i值
        for(long long b=a+1;a*b*b<n;b++){
               if((n%(a*b))==0) ans+=6; 
        } 
    } 
    cout<<ans;
    return 0; 
 }

总结

这种题可以通过暴力枚举来解决,但是直接使用暴力解决的话,会存在超时问题,还需要优化,如题上的限制a<b<c;