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; }
相关文章推荐
- HDU 1496 Equations
- hdu 1496 -- Equations(哈希)
- hdu 1496 equations(哈希)
- Equations(HDU_1496) hash
- Equations(hdu 1496 二分查找+各种剪枝)
- HDU 1496 Equations
- hdu1496 Equations(hash表)
- HDU 1496 Equations 经典哈希
- HDU 1496 Equations(hash)
- hdu 1496 Equations(hash备忘)
- hdu_1496_equations( 二分 or hash )
- HDU_1496 Equations && POJ_1840 Eqs(Hash)
- HDU-1496-Equations && POJ-1840-Eqs (hash)
- HDU 1496 Equations(简单哈希)
- HDU 1496 Equations[HASH]
- hdu 1496 Equations 数论
- HDU 1496 Equations
- HDU 1496 Equations(哈希打表+二分暴力)
- HDU 1496 Equations
- HDU 1496 Equations(hash or 二分)