hdu1496(hash)

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 -4 1 1 1 1
 

Sample Output
 
   
39088 0 解题思路: 题意就是满足公式的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 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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);
    }
}


你可能感兴趣的:(HDU)