hdu1496

题意:给你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);
}
}
}

 

你可能感兴趣的:(include,暴力,数量级)