poj1840 hash

Eqs
题意:给出a1, a2, a3, a4, a5
求满足表达式 a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=0 的解(x1, x2, x3, x4, x5)的个数,其中xi范围是[-50, 50], xi != 0 (i = 1, 2, 3, 4, 5) 
分析:这题挺简单的,将解分成两组(x1, x2, x3) 和 (x4, x5),先三重循环求出a1x1 3+ a2x2 3+ a3x3 3他们的解,用开散列法对应到数组中,再用两重循环求出a4x4 3+ a5x5 3求得结果在hash表中查找然后判断就行了。
代码
    
      
#include < stdio.h >
#include
< string .h >
#include
< iostream >
using namespace std;
#define NN 1000020
#define MAXHASH 100003 // 这是一个素数
int x1, x2, x3, x4, x5;
int a1, a2, a3, a4, a5;
int idx;

typedef
struct po{
int sum;
struct po * nxt;

}PO;

PO f[NN];
PO
* head[MAXHASH];

int cube( int x){
return x * x * x;
}

int hash( int x){
int h = x % MAXHASH;
if (h < 0 ) h += MAXHASH;
return h;
}
int OK( int tmp){
int ans = 0 ;
int h = hash(tmp);
for (PO * p = head[h]; p; p = p -> nxt){
if (p -> sum == tmp){
ans
++ ;
}
}
return ans;
}

int main() {
int tmp, h;
scanf(
" %d%d%d%d%d " , & a1, & a2, & a3, & a4, & a5);
idx
= 0 ;
memset(head,
0 , sizeof (head));
for (x1 = - 50 ; x1 <= 50 ; x1 ++ ){
if (x1 == 0 ) continue ;
for (x2 = - 50 ; x2 <= 50 ; x2 ++ ){
if (x2 == 0 ) continue ;
for (x3 = - 50 ; x3 <= 50 ; x3 ++ ){
if (x3 == 0 ) continue ;
tmp
= a1 * cube(x1) + a2 * cube(x2) + a3 * cube(x3);
h
= hash(tmp);
f[idx].sum
= tmp;
f[idx].nxt
= head[h];
head[h]
= f + idx ++ ;
}
}
}
int res = 0 ;
for (x4 = - 50 ; x4 <= 50 ; x4 ++ ){
if (x4 == 0 ) continue ;
for (x5 = - 50 ; x5 <= 50 ; x5 ++ ){
if (x5 == 0 ) continue ;
tmp
= a4 * cube(x4) + a5 * cube(x5);
tmp
= - tmp;
res
+= OK(tmp);
}
}
printf(
" %d\n " , res);
return 0 ;
}

 

你可能感兴趣的:(hash)