#include <stdio.h>
#include <stdlib.h>
void readArray(FILE *in, int *v, int N);
void printArray(int *v, int N);
void swap(int *a, int *b);
int partition(int *v, int lower, int upper);
void quickSort(int *v, int lower, int upper);
int drawTriangles(int *v, int N);
void swap(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int partition(int *v, int lower, int upper){
int pivot, i, j;
pivot = v[upper];
j = lower;
for(i = 0; i <= upper - 1; i++){
if(v[i] <= pivot){
swap(v + i, v + j);
j++;
}
}
swap(v + j, v + upper);
return j;
}
void quickSort(int *v, int lower, int upper){
if(lower < upper){
int pos = partition(v, lower, upper);
quickSort(v, lower, pos - 1);
quickSort(v, pos + 1, upper);
}
}
void readArray(FILE *in, int *v, int N){
for(int i = 0; i < N; i++){
fscanf(in, "%d", v + i);
}
}
void printArray(int *v, int N){
for(int i = 0; i < N; i++){
printf("%d ", v[i]);
}
printf("\n");
}
int getThirdSide(int *v, int lower, int upper, int sum){
if(lower <= upper){
int mid = lower + (upper - lower) / 2;
if(v[mid] == sum){
return 1;
}
if(v[mid] > sum){
return getThirdSide(v, lower, mid - 1, sum);
}
else{
return getThirdSide(v, mid + 1, upper, sum);
}
}
return -1;
}
int drawTriangles(int *v, int N){
/*
Get 2 of sides and use binary search for the other one
O(n^2logn)
*/
int pitagora = 0, triangles = 0;
for(int i = 0; i < N - 2; i++){
pitagora += i * i;
for(int j = i; j < N - 1; j++){
pitagora += j * j;
if(getThirdSide(v, j, N - 1, pitagora) == 1){
triangles++;
}
else{
pitagora = 0;
}
}
}
return triangles;
}
int main(){
FILE *in, *out;
int N, *v;
in = fopen( "nrtri.in", "r");
out = fopen( "nrtri.out", "w");
fscanf(in, "%d", &N);
v = malloc( N * sizeof(int));
readArray(in, v, N);
quickSort(v, 0, N-1);
fprintf(out, "%d\n", drawTriangles(v, N));
free(v);
fclose(in);
fclose(out);
return 0;
}