您的位置:首页 > 其它

HDU 1496 Equations

2016-11-05 20:33 337 查看
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*x1^2+b*x2^2+c*x3^2+d*x4^2=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校园文化活动月”之“校庆杯”大学生程序设计竞赛暨杭州电子科技大学第四届大学生程序设计竞赛

解析:折半枚举+哈希。依据折半枚举的思想,可以将等式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 <cstdio>
#include <cstring>

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 = a*i*i+b*j*j;
++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 = -(c*i*i+d*j*j);
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: