代码改变世界

poj 1840 Eqs hash表 (vector)

2012-03-13 14:57  java环境变量  阅读(230)  评论(0编辑  收藏  举报

Eqs
Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 7593   Accepted: 3711

Description

Consider equations having the following form: 
a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 
The coefficients are given integers from the interval [-50,50]. 
It is consider a solution a system (x1, x2, x3, x4, x5) that verifies the equation, xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}. 

Determine how many solutions satisfy the given equation. 

Input

The only line of input contains the 5 coefficients a1, a2, a3, a4, a5, separated by blanks.

Output

The output will contain on the first line the number of the solutions for the given equation.

Sample Input

37 29 41 43 47

Sample Output

654


                       这是我hash专题的第一题。花点时间看了下hash 的基础知识。   hash表的建立,hash表冲突的解决方法 等等。    主要是hash冲突解决 , 我在网上学了两种方法, 一种是 开式寻址法。 一种是 拉链法。  具体内容提供一个百度文库中关于hash表基础以及冲突解决方法的链接  个人觉得受益很大


 链接: hash表_构建方法

vector 使用


              拉链法 解决冲突可以通过两种方法实现,  STL中的 Vector   ,和 用链表。  其实差不多。 但用Vector感觉效率很低。。下面就贴一个 用了vector 的代码。用vector 很容易实现。我还得试试用链表实现拉链法, 实现了再写。


//Memory: 6232 KB		Time: 2563 MS
//Language: C++		Result: Accepted

#include<cstdio>
#include<vector>
using namespace std;
const int MAX=9997;
vector<int > hash[MAX];  //建立开放的哈希表
int p[101];
int main()
{
	//freopen("1.txt","r",stdin);
	int i,j,k,a,b,c,d,e,t1,t2;
	for(i=0;i<=100;i++)  //打个立方的表 
	{
		if(i==50) continue;
		p[i]=(i-50)*(i-50)*(i-50);
	}
	while(scanf("%d%d%d%d%d",&a,&b,&c,&d,&e)!=EOF)
	{
		for(i=0;i<MAX;i++)  //哈希表初始化清空
			hash[i].clear();
		int count=0;
		for(i=0;i<=100;i++)
		{
			if(i==50) continue;
			for(j=0;j<=100;j++)
			{
				if(j==50) continue;
				for(k=0;k<=100;k++)
				{
					if(k==50) continue;
					t1=a*p[i]+b*p[j]+c*p[k];
					t2=abs(t1%MAX);      //除余法,用余数当关键值 key
					hash[t2].push_back(t1);  //关键值对应的 可存储存储多个开放的元素
				}
			}
		}
		for(i=0;i<=100;i++)
		{
			if(i==50) continue;
			for(j=0;j<=100;j++)
			{
				if(j==50) continue;
				t1=-d*p[i]-e*p[j];
				t2=abs(t1%MAX);
				if(!hash[t2].empty())    //如果想查找的关键值中 有数据
				{
					for(k=0;k<hash[t2].size();k++)  // 查找关键值中所有的数据
					{
						if(t1==hash[t2][k])   //如果有对应的数据 结果+1
							count++;
					}
				}
			}
		}
		printf("%d\n",count);
	}
	return 0;
}