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]即可。
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; }
相关文章推荐
- HDU 1496 Equations(hash)
- hdu1496 Equations(hash表)
- HDU 1496 Equations
- hdu 1496 -- Equations(哈希)
- HDU 1496 Equations 经典哈希
- HDU 1496 Equations(简单哈希)
- HDU 1496 Equations
- hdu 1496 Equations 数论
- HDU 1496 Equations (hash)
- HDU-1496-Equations && POJ-1840-Eqs (hash)
- hdu 1496 Equations
- hdu 1496 Equations (暴力+hash)
- HDU 1496 Equations
- HDU 1496 Equations(哈希打表+二分暴力)
- hdu_1496_equations( 二分 or hash )
- HDU_1496 Equations && POJ_1840 Eqs(Hash)
- hdu 1496 Equations (整数Hash)
- hdu 1496 Equations(hash备忘)
- hdu 1496 Equations(暴力,哈希表 剪枝)
- HDU 1496 Equations hash HDU上排名第一!