题目链接:
说明:
题目提示,希望n=l*w*h,即长宽高都是n的因数,那么这就是一道分解因数的题。
因为是一道填空题,不用考虑超时。采用枚举的方式先把因数全部找出来,再三重循环将因数进行一个组合。
一个优化的小地方是,只有 ((n/factors[i])%factors[j]==0)时,才进行第三次循环,因为如果n/factors[i]无法整除factors[j],这个因数组合显然是不合法的,所以肯定不用继续了。
另外在第三个循环里面找到了第三个因数之后也不用再继续循环下去了,因为前两个数确定,第三个数肯定是唯一的。
代码:
#include<bits/stdc++.h>
#define int long long
const int N=1e3+10;
using namespace std;
int n=2021041820210418ll;
int ans=0;
vector<int> factors;
//找因数时需要枚举的数平方<=原数的原因就是, 当你找到一个因数时,只需要原数除以/找到的这个因数,你就找到另外一个因数了 ,注意要判断两个因数是否相等
signed main() {
cin.tie(0);
cout.tie(0);
int m=sqrt(n);
for(int i=1;i<m;i++){
if(n%i==0){
factors.push_back(i);
int k=n/i;
if(k!=i){
factors.push_back(k);
}
}
}
int lens=factors.size();
// sort(factors.begin(),factors.end());
for(int i=0;i<lens;i++){
for(int j=0;j<lens;j++){
//分解因数,只需要找出前两个因数,因为只要找到前两个因素,第三个数就自然找到了
if((n/factors[i])%factors[j]==0){
//不知道为什么注释掉的这一段比起再开一个循环更慢
// int k=n/factors[i]/factors[j];
// ans++;
for(int k=0;k<lens;k++)
if(factors[i]*factors[j]*factors[k]==n){
ans++;
break;
}
}
}
}
cout<<ans;
return 0;
}