POJ1840 Eqs(hash)

给出 a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 中的系数,还有x1,x2,x3,x4,x5范围[-50,50],求有几组 xi 的值满足等式

 

第一次碰 hash ,弱爆了的说,学着人家写的,用取余数建表,开始的时候,前三项建表,一直TLE……

后来改成前两项建表,后三项查找,过去了。想想也是,建表时需要考虑去重问题,遍历链表会比较浪费时间,所以建表时应该尽量写得简便一些……

 

Code:

#include<stdio.h>
const int N = 999999;

int ans;
struct Node{
	int x;
	Node *next;
}node[N];

int _abs(int x){
	if(x<0)return -x;
	return x;
}

void insert(int value){
	int key=_abs(value)%N;
	Node *shit = &node[key];
	
	Node *point;
	point = new Node;
	point->x=value; point->next=NULL;
	
	while(shit->next != NULL)shit=shit->next;
	shit->next = point;
}

void search(int value){
	int key=_abs(value)%N;
	Node *point = &node[key];

	while(point->next != NULL){
		point = point->next;
		if( (point->x) + value == 0)ans++;
	}
}

int main()
{
	int a[6],i,j,k;
	scanf("%d%d%d%d%d",&a[1],&a[2],&a[3],&a[4],&a[5]);
	for(i=-50;i<=50;i++){
		for(j=-50;j<=50;j++)
			if(i!=0 && j!=0)insert(a[1]*i*i*i + a[2]*j*j*j);
	}
	for(i=-50;i<=50;i++){
		for(j=-50;j<=50;j++){
			for(k=-50;k<=50;k++)
				if(i!=0 && j!=0 && k!=0)search(a[3]*i*i*i + a[4]*j*j*j + a[5]*k*k*k);
		}
	}
	printf("%d\n",ans);
	return 0;
}


 

你可能感兴趣的:(POJ1840 Eqs(hash))