HDU 1496 Equations

Equations
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8028 Accepted Submission(s): 3274


Problem Description Consider equations having the following form:

a*x12+b*x22+c*x32+d*x42=0
a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.

It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}.

Determine how many solutions satisfy the given equation.


Input The input consists of several test cases. Each test case consists of a single line containing the 4 coefficients a, b, c, d, separated by one or more blanks. End of file.
Output For each test case, output a single line containing the number of the solutions.
Sample Input

1 2 3 -4
1 1 1 1


Sample Output

39088
0


Author LL
Source [“2006校园文化活动月”之“校庆杯”大学生程序设计竞赛暨杭州电子科技大学第四届大学生程序设计竞赛](http://acm.hdu.edu.cn/search.php?field=problem&key=%A1%B02006%D0%A3%D4%B0%CE%C4%BB%AF%BB%EE%B6%AF%D4%C2%A1%B1%D6%AE%A1%B0%D0%A3%C7%EC%B1%AD%A1%B1%B4%F3%D1%A7%C9%FA%B3%CC%D0%F2%C9%E8%BC%C6%BE%BA%C8%FC%F4%DF%BA%BC%D6%DD%B5%E7%D7%D3%BF%C6%BC%BC%B4%F3%D1%A7%B5%DA%CB%C4%BD%EC%B4%F3%D1%A7%C9%FA%B3%CC%D0%F2%C9%E8%BC%C6%BE%BA%C8%FC+&source=1&searchmode=source)
解析:折半枚举+哈希。依据折半枚举的思想,可以将等式a\*x1^2+b\*x2^2+c\*x3^2+d\*x4^2 = 0转化为a\*x1^2+b\*x2^2 = -(c\*x3^2+d\*x4^2)后进行枚举,这样大大降低了枚举量。根据所给的数据范围,易知a\*x1^2+b\*x2^2和-(c\*x3^2+d\*x4^2)均位于区间[-1000000, 1000000]内,因而可以建立一个哈希表h[],数据x映射到x+1000000处。即初始化h[]为0,枚举等式a\*x1^2+b\*x2^2 = -(c\*x3^2+d\*x4^2)的左边,每当x出现时,h[x+1000000]++。枚举等式右边时,结果加上h[x+1000000]即可。
``` #include #include

const int offset = 1000000;
int h[offset*2+5];
int a, b, c, d;

void solve()
{
memset(h, 0, sizeof h);
for(int i = -100; i <= 100; ++i){
if(i != 0){
for(int j = -100; j <= 100; ++j){
if(j != 0){
int x = aii+bjj;
++h[x+offset];
}
}
}
}
int res = 0;
for(int i = -100; i <= 100; ++i){
if(i != 0){
for(int j = -100; j <= 100; ++j){
if(j != 0){
int x = -(cii+djj);
res += h[x+offset];
}
}
}
}
printf("%d\n", res);
}

int main()
{
while(~scanf("%d%d%d%d", &a, &b, &c, &d)){
if((a>0 && b>0 && c>0 && d>0) || (a<0 && b<0 && c<0 && d<0)){
printf("0\n");
continue;
}
solve();
}
return 0;
}

posted on 2016-11-05 20:33  月夜下  阅读(88)  评论(0编辑  收藏  举报

导航

"320px">