看题传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=1496
题目大意:
给定a,b,c,d。a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
其中x1~x4 在 [-100,100]区间内, a,b,c,d在[-50,50] 区间内。
求满足上面那个式子的所有解的个数。
思路:
这题用hash的思想很巧妙,先对x1和x2进行枚举,存在的存进hash表中,然后接下来枚举x3和x4,如果恰好和前面的为相反数,那么答案+上前面出现的次数.
提高效率的方法:
1.用枚举1~100而负半区域不考虑,节省枚举数,最后答案因为四个数全部都是正的,而实际上都有每个数都有正有负,故答案*16
2.把平方运算结果存下来。
3.位运算优化hash取模
4.同号的剪枝
#include <bits/stdc++.h>
using namespace std;
map<int,int> mp;
int main()
{
int x1,x2,x3,x4;
while(scanf("%d%d%d%d",&x1,&x2,&x3,&x4)!=EOF)
{
if(x1>0 && x2>0 && x3>0 && x4>0 || x1<0 && x2<0 && x3<0 && x4<0)
{
printf("0\n");
continue;
}
int ans=0;
mp.clear();
for(int a=1;a<=100;a++)
{
for(int b=1;b<=100;b++)
{
mp[x1*a*a+x2*b*b]++;
}
}
for(int a=1;a<=100;a++)
{
for(int b=1;b<=100;b++)
{
ans+=mp[-(x3*a*a+x4*b*b)];
}
}
printf("%d\n",ans*16 );
}
}