题目
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;
}