题意:给你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 <map> #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; map <int ,int>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); } } }
转载于:https://blog.51cto.com/8590696/1358825