1.题目描述:
2.分析:
这道题目必然会卡你5重循环暴力以及你在怎么优化也会吃T,这道题目其实我也不知道正解是什么,我使用C++ 的STL的map来算的,我们先把右边等式的值算出来作为关键字存储,然后在将该关键字++,最后我们算出左边的值用三重循环遍历出来大概时间复杂度为O(100 * 100 * 100) = O(1e6),时间上不会爆,那么内存可能勉强也不会爆。然后我们在map中查找元素,时间复杂度为O(logn)。
这样就可以过了.
3.代码:
/*
-14 -42 -23 27 -48
3022
*/
#include <bits/stdc++.h>
using namespace std;
map<int, int> m;
int main() {
int a, b, c, d, e;
scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
for (int i = -50; i <= 50; i++) {
if (i == 0) continue;
for (int j = -50; j <= 50; j++) {
if (j == 0) continue;
int x = d * i * i * i + e * j * j * j;
m.insert(make_pair(x, m[x]++));
}
}
int ans = 0;
for (int i = -50; i <= 50; i++) {
if(i == 0) continue;
for (int j = -50; j <= 50; j++) {
if (j == 0) continue;
for (int k = -50; k <= 50; k++) {
if (k == 0) continue;
int x = a * i * i * i + b * j * j * j + c * k * k * k;
if (m.count(x)) {
ans += m[x];
}
}
}
}
printf("%d\n", ans);
return 0;
}