#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'; } |