hdu 1496
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1496
题意:给a,b,c,d。计算有多少组(x1,x2,x3,x4)满足方程。
mark:这其实是poj1840的Eqs简化成的问题,是一个经典的hash问题,但是poj是对内存限制严格,此题则是对时间卡的更紧,TLE了好多次。
首先将等式分成两边,写成a*x1^2+b*x2^2 = - c*x3^2-d*x4^2,然后枚举其中一边的所有值存起来(hash存),再枚举另一边求解。
懒得写hash,直接开200w的数组不是不行,但是很容易TLE。千万不能用O(n)的方式清零数组,应该再执行一次存数时的枚举,原来是++后面就用--来平衡。
后来发现,加一个优化判断a,b,c,d四数同号的时候直接输出0,会快很多!!!
代码:
1 # include <stdio.h> 2 3 4 # define OFFSET 1000001 5 6 7 int val[2000010] ; 8 9 10 int main () 11 { 12 int a, b, c, d ; 13 int x1, x2, ans ; 14 while (~scanf ("%d%d%d%d", &a, &b, &c, &d)) 15 { 16 // memset (val, 0, sizeof(val)) ; 17 for (x1 =1 ; x1 <= 100 ; x1++) 18 for (x2 = 1 ; x2 <= 100 ; x2++) 19 val[a*x1*x1+b*x2*x2+OFFSET]++ ; 20 ans = 0 ; 21 for (x1 = 1 ; x1 <= 100 ; x1++) 22 for (x2 = 1 ; x2 <= 100 ; x2++) 23 ans += val[-c*x1*x1-d*x2*x2+OFFSET] ; 24 25 26 for (x1 =1 ; x1 <= 100 ; x1++) 27 for (x2 = 1 ; x2 <= 100 ; x2++) 28 val[a*x1*x1+b*x2*x2+OFFSET]-- ; 29 printf ("%d\n", ans*16) ; 30 } 31 return 0 ; 32 }