#include <bits/stdc++.h>
using namespace std;
long long po(int n,int k){
long long ans=1;
for(int i=n;i>n-k;i--){
ans=ans*i;
}
long long k_silnia=1;
for(int i=1;i<=k;i++){
k_silnia=k_silnia*i;
}
ans=ans/k_silnia;
return ans;
}
int main(){
int n;
cin>>n;
vector<int>in;
for(int i=0;i<n;i++){
int a;
cin>>a;
in.push_back(a);
}
vector<int>v;
for(int i=0;i<n;i++){
int suma=in[i];
v.push_back(suma);
for(int j=i+1;j<n;j++){
suma+=in[j];
v.push_back(suma);
}
}
long long ans=0;
map<int,int>m;
for(int i=0;i<v.size();i++){
m[v[i]]++;
}
if(m[0]>=3){//kiedy trzy takie same
long long x=m[0]*(m[0]-1)*(m[0]-2);
x=x/6;
ans+=x;
}
for(int i=-20000;i<=20000;i++){//kiedy dwa takie same i jedno rozne
if(i!=0){
if(m[i]>=2){
if(m[-2*i]>=1){
ans+=po(m[i],2)*m[-2*i];
}
}
}
}
vector<int>v2;
for(int i=-20000;i<=20000;i++){
if(m[i]>0){
v2.push_back(i);
}
}
sort(v2.begin(),v2.end());
for(int i=0;i<v2.size()-1;i++){
int a=v2[i];
int l=i+1;
int r=v2.size()-1;
while(l<r){
int b=v2[l];
int c=v2[r];
if(a+b+c==0){
ans+=(long long)m[a]*(long long)m[b]*(long long)m[c];
l++;
r--;
}
else if(a+b+c<0){
l++;
}
else{
r--;
}
}
}
cout<<ans<<'\n';
}
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | #include <bits/stdc++.h> using namespace std; long long po(int n,int k){ long long ans=1; for(int i=n;i>n-k;i--){ ans=ans*i; } long long k_silnia=1; for(int i=1;i<=k;i++){ k_silnia=k_silnia*i; } ans=ans/k_silnia; return ans; } int main(){ int n; cin>>n; vector<int>in; for(int i=0;i<n;i++){ int a; cin>>a; in.push_back(a); } vector<int>v; for(int i=0;i<n;i++){ int suma=in[i]; v.push_back(suma); for(int j=i+1;j<n;j++){ suma+=in[j]; v.push_back(suma); } } long long ans=0; map<int,int>m; for(int i=0;i<v.size();i++){ m[v[i]]++; } if(m[0]>=3){//kiedy trzy takie same long long x=m[0]*(m[0]-1)*(m[0]-2); x=x/6; ans+=x; } for(int i=-20000;i<=20000;i++){//kiedy dwa takie same i jedno rozne if(i!=0){ if(m[i]>=2){ if(m[-2*i]>=1){ ans+=po(m[i],2)*m[-2*i]; } } } } vector<int>v2; for(int i=-20000;i<=20000;i++){ if(m[i]>0){ v2.push_back(i); } } sort(v2.begin(),v2.end()); for(int i=0;i<v2.size()-1;i++){ int a=v2[i]; int l=i+1; int r=v2.size()-1; while(l<r){ int b=v2[l]; int c=v2[r]; if(a+b+c==0){ ans+=(long long)m[a]*(long long)m[b]*(long long)m[c]; l++; r--; } else if(a+b+c<0){ l++; } else{ r--; } } } cout<<ans<<'\n'; } |
English