最开始用的三重循环,从1枚举到n,计算三个数相乘是否为n
但 目标值太大了,16位数组,外加三重循环,这怕不是要起飞
所以要进行优化 感慨一句:vector 太好用了吧~
vector 动态数组 不会爆
第一种方法:
#include<iostream>
#include<vector>
using namespace std;
vector<long long> q;
int main()
{
long long n,tt=0,ans=0;
cin>>n;
for(long long i=1;i*i<=n;i++)
{
if(n%i==0)
{
q.push_back(i);
if(n/i!=i) q.push_back(n/i);
}
}
for(auto a : q)
{
for(auto b:q)
{
for(auto c:q)
{
if(a*b*c==n)
{
ans++;
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
printf("%lld\n",ans);
}
}
}
}
printf("%lld\n",ans);
return 0;
}
第二种方法:
我们发现求三个数相乘得到n ,那么这三个数便是n的因子
我们可以先把n的因子求出来,再一个一个枚举,找到答案~
#include <iostream>
using namespace std;
int main()
{
unsigned long long N=2021041820210418;
long long i,j,k,sum=0;
for(i=1;i*i*i<=N;i++)
{
if(N%i==0)
{
for(j=i;i*j*j<=N;j++)
{
if(N/i%j==0)
{
k=N/i/j;
if(i==j||i==k||j==k)sum+=3; // 三个数其中两个数一样
else if(i==j&&i==k)sum++; // 三个数相同 加一次即可
else sum+=6; // 三个不重复的数全排列
}
}
}
}
cout<<sum<<endl;
return 0;
}