# 4 Values whose Sum is 0 (POJ

题目

SUM问题可以表示为:给定四个具有整数值的列表A,B,C,D,计算多少个四元组(a,b,c,d)∈A x B x C x D使得a + b + c + d = 0。在下文中,我们假定所有列表的大小均相同。
输入项
输入文件的第一行包含列表n的大小(该值可以最大为4000)。然后,我们有n行包含四个分别属于A,B,C和D的整数值(绝对值最大为2 28)。
输出量
对于每个输入文件,您的程序必须编写四倍数,其总和为零。

.

Sample Input
6
-45 22 42 -16
-41 -27 56 30
-36 53 -37 77
-36 30 -75 -46
26 -38 -10 62
-32 -54 -6 45
Sample Output
5

答案

#include<cstdio>
using namespace std;
const int MAX=4000*4000+7;
int h[MAX],t[MAX];
int n,j,i,a[4003],b[4003],c[4003],d[4003],P;
long long sum=0;
int hash(int x){
	int y=x%MAX;
	if(y<0) y+=MAX;
	while (h[y]!=0&&t[y]!=x)
	y=(y+1)%MAX;
	return y;
}
int main(){
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				P=hash(a[i]+b[j]);
				h[P]++;
				t[P]=a[i]+b[j];
			}
		}
	
	for(i=0;i<n;i++)
		for(j=0;j<n;j++){
			P=hash(-(c[i]+d[j]));
			sum+=h[P];
		}
	printf("%lld",sum);
	return 0;
}
原文地址:https://www.cnblogs.com/yuanyulin/p/14026786.html