hdu1496(hash)

来源:互联网 发布:域名紧急升级正在跳转 编辑:程序博客网 时间:2024/06/12 20:15

Equations

Equation

Time Limit: 6000/3000 MS (Java/Others)   

Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5535    Accepted Submission(s): 2196

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496
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 -41 1 1 1
 

Sample Output
390880解题思路: 题意就是满足公式的x1,x2,x3,x4有多少种。 暴力O(n^4)超时·····hash优化···直接降到了O(n^2)····· 可以建立两个数组,首先计算a * x1 ^ 2 + b * x2 ^ 2,正数存入hash1,负数存入hash2。然后计算c * x3 ^ 2 + d * x4 ^ 2,如果是正数则在hash2查找,负数在hash1查找。完整代码:
#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;const int maxn = 1000001;int hash1[maxn];int hash2[maxn];int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    int a , b , c , d;    while(~scanf("%d%d%d%d" , &a , &b , &c , &d))    {        int cnt = 0;        if( (a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0) )        {            printf("0\n");            continue;        }        memset(hash1 , 0 , sizeof(hash1));        memset(hash2 , 0 , sizeof(hash2));        for(int i = 1 ; i <= 100 ; i ++)        {            for(int j = 1 ; j <= 100 ; j ++)            {                int k = a * i * i + b * j * j;                if(k >= 0)                    hash1[k] ++;                else                    hash2[-k] ++;            }        }        for(int i = 1 ; i <= 100 ; i ++)        {            for(int j = 1 ; j <= 100 ; j ++)            {                int k = c * i * i + d * j * j;                if(k > 0)                    cnt += hash2[k];                else                    cnt += hash1[-k];            }        }        printf("%d\n",cnt * 16);    }}


0 0
原创粉丝点击