题意:给你abcd,问a*x1^2+b*x2^2+c*x3^2+d*x4^2=0有多少个解

解题思路:暴力的话,至少有100^4,这个数量级注定是死亡的。这里又是map冒充hash表的题目,首先把等式变为

a*x1^2+b*x2^2=-c*x3^2-d*x4^2
那么把等式左边的所有可能值及其各存起来-----map[左边的所有可能值] = 个数
然后枚举x3和x4所有的组合值来查看map中出现值的个数,并加起来----ans+=map[-c*x3^2-d*x4^2]
最后,由于每个值有正负两种状态,所以一共有2*2*2*2=16种状态
最后答案为ans=ans*16

946msG++代码

#include #include 
#include
#include
using namespace std;map
mm;int main(){int n,m;int a,b,c,d;int count;while(scanf("%d %d %d %d",&a,&b,&c,&d) != EOF){if((a > 0 && b>0 && c>0 && d>0)||(a<0 && b<0 && c<0 && d<0) ){printf("0\n");continue;}else{count = 0;mm.clear();for(int i = 1; i <= 100;i++){for(int j = 1; j<=100;j++)mm[i*i*a+j*j*b]++;}for(int i = 1; i <= 100;i++){for(int j = 1; j<=100;j++)if(mm[i*i*(-c)+j*j*(-d)]>0)count += mm[i*i*(-c)+j*j*(-d)];}printf("%d\n",count*16);}}}