分析:
可能会想到直接暴力做,就是从1遍历到n,遍历3次,得到ijk,然后如果
i
×
j
×
k
=
n
i \times j \times k =n
i×j×k=n,那么就是一种方案。但是这样要很久很久。
改进方法:
先求出n的所有约数,一共只有128个,然后遍历约数得到ijk就行了,其中k可以通过
n
/
i
/
j
n / i / j
n/i/j得到。虽然看着
n
/
i
/
j
∗
i
∗
j
n / i / j * i * j
n/i/j∗i∗j结果没变,但是要知道,可能
n
/
i
/
j
n / i / j
n/i/j后为小数,再乘起来就不一样了,如
18
÷
6
÷
6
=
0.5
18 \div 6 \div 6=0.5
18÷6÷6=0.5
答案:2430
最佳方案
#include<iostream>
#include<vector>
using namespace std;
const long long N = 2021041820210418;
long long res;
int main()
{
vector<long long>d;
for(long long i = 1; i *i < N; i++)
{
if(N % i == 0)
{
d.push_back(i);
if(N % i != i) d.push_back(N / i);
}
}
for(auto i : d)
{
for(auto j : d)
{
long long k = N / i / j;//这里不能省,例如18/6/6=0.5,这时候k=0了,乘完不等于原来的数
if(i *j * k==N) res++;
}
}
cout << res;
return 0;
}
改进的暴力
改进了一点的没看懂,所以还是第一种好了
直接的暴力(算了好久未出结果)
#include<iostream>
using namespace std;
const long long N = 2021041820210418;
long long res;
int main()
{
for(long long i = 1; i < N; i++)
{
for(long long j = 1; j < N; j++)
{
for(long long k = 1; k < N; k++)
if(i * j * k == N) res++;
}
}
cout << res;
return 0;
}