weinan030416

导航

货物摆放

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

现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。

小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足 �=�×�×�n=L×W×H。

给定 n,请问有多少种堆放货物的方案满足要求。

例如,当 �=4n=4 时,有以下 66 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×11×1×41×2×21×4×12×1×22×2×14×1×1。

请问,当 �=2021041820210418n=2021041820210418 (注意有 1616 位数字)时,总共有多少种方案?

提示:建议使用计算机编程解决问题。

严重超时算法

#include <iostream>
using namespace std;
const long long int n=2021041820210418;
int main()
{
  int ans=0;
  for(long long int i=1;i<n;i++)
    for(long long int j=1;j<n;j++)
      for(long long int k=1;k<n;k++)
      if(i*j*k==n)
      ans++;
  cout<<ans;
  return 0;
}

枚举因子

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
long long a[maxn];
int main()
{
    long long n;
    cin >> n;
    int len = 0;
    for(long long i = 1 ; i * i <= n ; i ++){
        if(n % i == 0){
            a[len ++] = i;
            if(i != n / i){
                a[len ++] = n / i;
            }
        }
    }
    long long cnt = 0;
    for(long long i = 0 ; i < len ; i ++){
        for(int j = 0 ; j < len ; j ++){
            if(a[i] * a[j] > n)continue;
            for(long long k = 0 ; k < len ; k ++){
                if(a[i] * a[j] * a[k] == n){
                    cnt ++;
                }
            }
        }
    }
    cout << cnt << '\n';
    return 0;
}

 

posted on 2023-02-02 10:55  楠030416  阅读(42)  评论(0编辑  收藏  举报