/*
* Problem :: 5624 / 좋은 수
*
* Kind :: Dynamic Programming
*
* Insight
* - 앞에 있는 수 세 개의 합이라...
* 일단 순서가 필요하니 정렬은 못 하겠다
* + 두 수의 합이라면
* Map 이나 Set 을 활용해서
* for (int i=1; i<N; i++) {
* for (int j=0; j<i; j++) {
* if (A[i]-A[j] 가 Map/Set 에 포함되면 true) {
* ans++;
* break;
* }
* }
* }
* 이렇게 찾으면 될 텐데...
* # 잠깐, 그러면
* 세 수의 합 = 두 수의 합 + 한 수
* 로 생각할 수 있고
* i번째 수 앞의 두 수의 합들을 항상 추적하고 있다면
* if (A[i]-A[j] 를 i번째 수 앞의 두 수의 합으로 만들 수 있다면 true) {
* ans++;
* break;
* }
* 로 답을 구할 수 있다!
*
* Point
* - 솔직히 음수 처리가 귀찮다면
* Map/Set 으로 풀어도 된다
* + 다만, 좀더 수행시간을 줄이고 싶다면 배열로 풀자
* # -100,000 <= A_i <= 100,000 이라
* 가능한 범위를 배열로 잡아도 메모리를 초과하지 않는다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N; cin >> N;
int A[N];
for (int i=0; i<N; i++)
cin >> A[i];
// Process
int ofs = 200'000;
bool S2[2*ofs+1]; /* S2[j] = i번째 수 앞의 두 수의 합으로 j 를 만들 수 있는지 여부 */
memset(S2, false, sizeof(S2));
S2[A[0]+A[0]+ofs] = true; /* 2번째 수 앞의 두 수의 합으로 만들 수 있는 수
* = 1번째 수 + 1번째 수 */
int ans = 0;
for (int i=1; i<N; i++) {
for (int j=0; j<i; j++) {
/* A[i] = 세 수의 합
* A[j] = 한 수
* A[i]-A[j] = 두 수의 합 */
if (S2[A[i]-A[j]+ofs]) {
ans++;
break;
}
}
/* S2 갱신
* A[i]+A[j] = i번째 수를 이용하여 만들 수 있는 두 수의 합 */
for (int j=0; j<=i; j++) {
S2[A[i]+A[j]+ofs] = true;
}
}
// Control : Output
cout << ans << endl;
}
// Helper Functions
/* None */