#include<iostream>
#include<fstream>
using namespace std;
static const int MAX = 100000;
static int htable[MAX][10];
static int num[MAX];
//#define DEBUG
/* 4556K 235MS */
int main()
{
#ifdef DEBUG
fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif
int a1, a2, a3, a4, a5;
int total = 0;
cin >> a1 >> a2 >> a3 >> a4 >> a5;
int x1, x2, x3, x4, x5;
for (x1 = -50; x1 <= 50; x1++)
{
if (x1 == 0) continue;
for (x2 = -50; x2 <= 50; x2++)
{
if (x2 == 0) continue;
int r = a1 * x1 * x1 * x1 + a2 * x2 * x2 * x2;
int i = r % MAX;
i = i < 0 ? (i + MAX) : i;
htable[i][num[i]++] = r;
}
}
for (x3 = -50; x3 <= 50; x3++)
{
if (x3 == 0) continue;
for (x4 = -50; x4 <= 50; x4++)
{
if (x4 == 0) continue;
for (x5 = -50; x5 <= 50; x5++)
{
if (x5 == 0) continue;
int r = a3 * x3 * x3 * x3 + a4 * x4 * x4 * x4 + a5 * x5 * x5 * x5;
r = -r;
int i = r % MAX;
i = i < 0 ? (i + MAX) : i;
int j;
for (j = 0; j < num[i]; j++)
{ if (htable[i][j] == r) total++; }
}
}
}
cout << total << endl;
return 0;
}
a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 , x13是x1的3次方。
求满足以上条件的(x1, x2, x3, x4, x5)共有多少个? xi∈[-50,50], xi != 0。
最直接的方法是5个嵌套循环每当找到一组解计数就加一。
但是循环的次数太多 100^5就是10^10,运行时间很长。
一个替代的方法就将等式进行拆分分成两部分
a1x13+ a2x23 = -(a3x33+ a4x43+ a5x53)。
1.先计算一边并存储结果。
2.计算另一半到结果中查找是否存在
提高速度的方法就是提高查找速度,时候hash方法。散列表的大小并没有经过仔细的论证,
可能空间有点大。