您的位置:首页 > 其它

HDU 1496 Equations

2015-01-07 01:17 459 查看


Equations

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496

题目大意: 有一个方程式:a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 , 其中a,b,c,d属于 [-50,50]且不等于0,x1,x2,x3,x4属于 [-100,100]
且不等于0,现在给出a,b,c,d的值,要求x1,x2,x3,x4解的方案数。

题目思路;首先想到是暴力枚举,但是100*100*100*100的复杂度是会超时的,所以这里有个巧妙地方法就是将方程变为:a*x1^2+b*x2^2=-(c*x3^2+d*x4^2)

这样的话就只要先枚举x1,x2,并用hash数组去标记每次结果的次数,再枚举x3,x4得到方案数,这样就变成了2*100*100的复杂度,避免了超时。然后就是枚举的时候因为得到的结果可能是负数,所以要用两个hash数组记录,还有就是因为x的二次方,所以每个x都有可能是正号或者负号,所以最后方案数要乘以2的4次方。

AC代码:

#include<stdio.h>
#include<string.h>
#define N 2500010
int f1
,f2
;
int main(){
int a,b,c,d;
while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
if(a*b>0&&b*c>0&&c*d>0) printf("0\n");
else{
int sum;
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++){
sum=a*i*i+b*j*j;
if(sum<0) f1[-sum]++;
else f2[sum]++;
}
int ans=0;
for(int i=1;i<=100;i++)
for(int j=1;j<=100;j++){
sum=c*i*i+d*j*j;
if(sum>0) ans+=f1[sum];
else ans+=f2[-sum];
}
printf("%d\n",ans*16);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: