#include <iostream>
#include <vector>
#include <complex>
#include <cmath>
using namespace std;
const double PI = acos(-1.0);
using Complex = complex<double>;
void fft(vector<Complex>& a, bool invert) {
int n = a.size();
if (n <= 1) return;
for (int i = 1, j = 0; i < n; i++) {
int bit = n >> 1;
for (; j & bit; bit >>= 1) {
j ^= bit;
}
j ^= bit;
if (i < j) {
swap(a[i], a[j]);
}
}
for (int len = 2; len <= n; len <<= 1) {
double ang = 2 * PI / len * (invert ? -1 : 1);
Complex wlen(cos(ang), sin(ang));
for (int i = 0; i < n; i += len) {
Complex w(1);
for (int j = 0; j < len / 2; j++) {
Complex u = a[i + j], v = a[i + j + len / 2] * w;
a[i + j] = u + v;
a[i + j + len / 2] = u - v;
w *= wlen;
}
}
}
if (invert) {
for (Complex& x : a) {
x /= n;
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N;
cin >> N;
const int MAX_VAL = 50000;
const int OFFSET = 50000;
const int MAX_SUM = MAX_VAL * 2;
int poly_size = 1;
while (poly_size <= MAX_SUM + OFFSET) {
poly_size <<= 1;
}
vector<Complex> polyA(poly_size, 0);
vector<Complex> polyB(poly_size, 0);
for (int i = 0; i < N; ++i) {
int val;
cin >> val;
polyA[val + OFFSET] += 1;
}
for (int i = 0; i < N; ++i) {
int val;
cin >> val;
polyB[val + OFFSET] += 1;
}
vector<int> vecC(N);
for (int i = 0; i < N; ++i) {
cin >> vecC[i];
}
fft(polyA, false);
fft(polyB, false);
vector<Complex> poly_res(poly_size);
for (int i = 0; i < poly_size; i++) {
poly_res[i] = polyA[i] * polyB[i];
}
fft(poly_res, true);
long long count = 0;
for (int i = 0; i < N; ++i) {
int target_sum = vecC[i] + 2 * OFFSET;
if (target_sum >= 0 && target_sum < poly_size) {
count += round(poly_res[target_sum].real());
}
}
cout << count << endl;
return 0;
}