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

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

小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 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 × 11×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。

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

思路:

从n的所有约数中找3个数(可重复)乘积为n的个数

求所有约数:

vector<int>yue;
for(int i=1;i*i<=n;i++){
    if(n%i==0){
        yue.push_back(i);
        if(n/i!=i) yue.push_back(n/i);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
#include<iostream>
#include<vector>
using namespace std;
typedef long long LL;
int main(){
	LL n=2021041820210418;
	vector<LL>d;//储存n的所有约数
	for(LL i=1;i*i<=n;i++){
		if(n%i==0){
			d.push_back(i);
			if(n/i!=i)d.push_back(n/i);
		}
	} 
	int ans=0;
	vector<LL>::iterator a,b,c;
	for(a=d.begin();a!=d.end();a++){
		for(b=d.begin();b!=d.end();b++){
			for(c=d.begin();c!=d.end();c++){
				if((*a)*(*b)*(*c)==n){
					ans++;
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.