哈希题,如果前两项的和与后两项的和的相反数相等,则解增加一。由于前两项的和与后两项的和的相反数取值范围都在 [-1000000, 1000000],所以计算两者的哈希值,相等则解增加一。由于每个 xi 可正可负,所以最终数量要乘以 16。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 2000005;
int h[MAXN];
int main()
{
int a, b, c, d;
while (cin >> a >> b >> c >> d)
{
if ((a < 0 && b < 0 && c < 0 && d < 0) || (a > 0 && b > 0 && c > 0 && d > 0))
{
cout << 0 << endl;
continue;
}
memset(h, 0, sizeof(h));
for (int i = 1; i <= 100; i++) //计算前两项的和的哈希值
{
for (int j = 1; j <= 100; j++)
h[a * i * i + b * j * j + 1000000]++;
}
int total = 0;
for (int i = 1; i <= 100; i++) //计算后两项的和的相反数的哈希值
{
for (int j = 1; j <= 100; j++)
total += h[-c * i * i - d * j * j + 1000000];
}
cout << total * 16 << endl;
}
return 0;
}
继续加油。