货物摆放
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 �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×4、1×2×2、1×4×1、2×1×2、2×2×1、4×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; }