题目描述
PIPI有四个长度为n的整数集合 A,B,C,D 。现在从4个集合中分别取出a,b,c,d四个元素,使得a+b+c+d=0。PIPI想问: 总共有多少选法?
输入
输入第一行包含一个整数T代表测试用例数目。
对于每组测试用例,输入第一行是一个正整数 n ,代表集合大小(n<=4000)。
以下包含一个 n*4的矩阵,代表四个集合。
输出
对于每一个测试用例,输出一个数字代表选法数目,两组测试用例之间有一个空格。
样例输入
2
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
6
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
1 1 -1 -1
样例输出
5
1296
#include<bits/stdc++.h>
using namespace std;
const int N=4005;
int a[4][N];
unordered_map<int,int> mp;
int main()
{
int tcase,n;
scanf("%d",&tcase);
while(tcase--)
{
mp.clear();
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<4;j++)
scanf("%d",&a[j][i]); ///输入数组
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
mp[a[0][i]+a[1][j]]++; ///将(a+b)的值与个数进行映射
long long ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
int t=-(a[2][i]+a[3][j]); ///-(c+d)
ans+=mp[t]; ///如果-(c+d)=(a+b) 累加a+b的个数
}
}
printf("%lld\n",ans);
if(tcase) printf("\n"); ///空行
}
}