1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<bits/stdc++.h>
#define st 10000000
using namespace std;
constexpr int MAXC = 2e7+4;
constexpr int MAXN = 5e2+3;
int ile[MAXC], a[MAXN];

int main() {
  int odp = 0;
  int n;
  cin >> n;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  vector<int> c;
  for(int i = 1; i <= n; ++i) {
    int suma = a[i];
    if(!ile[suma+st]) {
      c.push_back(suma);
    }
    ile[suma+st]++;
    for(int j = i+1; j <= n; ++j) {
      suma += a[j];
      if(!ile[suma+st]) c.push_back(suma);
      ile[suma+st]++;
    }
  }
  for(int i = 0; i < (int)c.size(); ++i) {
    for(int j = i + 1; j < (int)c.size(); ++j) {
      int suma = c[i] + c[j];
      int szukana = -suma;
      //cerr << c[i] << ' ' << c[j] << ' ' << suma << ' ' << szukana << '\n';
      //cerr << (ile[szukana+st]*(ile[c[i]+st]-(c[i]==szukana))*(ile[c[j]+st]-(c[i]==c[j])-(c[j]==szukana))) << '\n';
      odp += (ile[szukana+st]*(ile[c[i]+st]-(c[i]==szukana))*(ile[c[j]+st]-(c[i]==c[j])-(c[j]==szukana)));
    }
  }
  odp /= 3;
  odp += ile[st]*(ile[st]-1)*(ile[st]-2)/6;
  //cout << ile[st] << '\n';
  cout << odp;
}