#include<bits/stdc++.h> using namespace std; int tab[510]; int sumy[510]; const int zero = (20000*500+3)*4; int zlicz1[zero*2], zlicz2[zero*2], zlicz3[zero*2]; int main() { int n, i, j, k; scanf("%d", &n); for(i=1;i<=n;i++){ scanf("%d", &tab[i]); sumy[i] = sumy[i-1]+tab[i]; } for(i=1;i<=n;i++) for(j=i;j<=n;j++) zlicz2[sumy[j]-sumy[i-1]+zero]++; long long wynik = 0; for(i=0;i<=n;i++){ if(i!=0){ for(j=1;j<=n;j++) for(k=j;k<=n;k++){ // printf("i:%d j:%d k:%d\n", i, j, k); // printf("wynik przed = %d\n", wynik); wynik+=zlicz1[zero + -(sumy[k]-sumy[j-1]+sumy[i])]; // printf("GLOWNE DODANIE: %d\n", zlicz1[zero + -(sumy[k]-sumy[j-1]+sumy[i])]); wynik-=zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]; // 3 = 1 // printf("PIERWSZE ODJECIE: %d\n", zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]); if((sumy[k]-sumy[j-1]+2*sumy[i])%2==0){ // 3 = 2 wynik-=zlicz3[zero + (sumy[k]-sumy[j-1]+2*sumy[i])/2]; // printf("DRUGIE ODJECIE: %d\n", zlicz3[zero + (sumy[k]-sumy[j-1]+2*sumy[i])/2]); } if(k==i){ wynik-=zlicz2[zero + -(2*sumy[k]-2*sumy[j-1])]; //1 == 2 // printf("TRZECIE ODJECIE : %d\n", zlicz2[zero + -(2*sumy[k]-2*sumy[j-1])]); if((sumy[k]-sumy[j-1]+2*sumy[i])%2==0 && sumy[k]-sumy[j-1]==0){ wynik+=2; // printf("WSZYSTKIE 3 ROWNE: 3\n"); } // printf("wynik po = %d\n", wynik); /* wynik+=zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]; printf("CZWARTE DODANIE: %d\n", zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]); if(sumy[k]-sumy[j-1]==0){ wynik++; printf("KONTRA PIERWSZEGO I DRUGIEGO ODJECIA: 1\n"); }*/ } } } for(j=1;j<=n;j++) for(k=j;k<=n;k++) zlicz1[sumy[k]-sumy[j-1] - sumy[i] + zero]++; zlicz3[sumy[i] + zero]++; } printf("%lld\n", wynik/6); }
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 | #include<bits/stdc++.h> using namespace std; int tab[510]; int sumy[510]; const int zero = (20000*500+3)*4; int zlicz1[zero*2], zlicz2[zero*2], zlicz3[zero*2]; int main() { int n, i, j, k; scanf("%d", &n); for(i=1;i<=n;i++){ scanf("%d", &tab[i]); sumy[i] = sumy[i-1]+tab[i]; } for(i=1;i<=n;i++) for(j=i;j<=n;j++) zlicz2[sumy[j]-sumy[i-1]+zero]++; long long wynik = 0; for(i=0;i<=n;i++){ if(i!=0){ for(j=1;j<=n;j++) for(k=j;k<=n;k++){ // printf("i:%d j:%d k:%d\n", i, j, k); // printf("wynik przed = %d\n", wynik); wynik+=zlicz1[zero + -(sumy[k]-sumy[j-1]+sumy[i])]; // printf("GLOWNE DODANIE: %d\n", zlicz1[zero + -(sumy[k]-sumy[j-1]+sumy[i])]); wynik-=zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]; // 3 = 1 // printf("PIERWSZE ODJECIE: %d\n", zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]); if((sumy[k]-sumy[j-1]+2*sumy[i])%2==0){ // 3 = 2 wynik-=zlicz3[zero + (sumy[k]-sumy[j-1]+2*sumy[i])/2]; // printf("DRUGIE ODJECIE: %d\n", zlicz3[zero + (sumy[k]-sumy[j-1]+2*sumy[i])/2]); } if(k==i){ wynik-=zlicz2[zero + -(2*sumy[k]-2*sumy[j-1])]; //1 == 2 // printf("TRZECIE ODJECIE : %d\n", zlicz2[zero + -(2*sumy[k]-2*sumy[j-1])]); if((sumy[k]-sumy[j-1]+2*sumy[i])%2==0 && sumy[k]-sumy[j-1]==0){ wynik+=2; // printf("WSZYSTKIE 3 ROWNE: 3\n"); } // printf("wynik po = %d\n", wynik); /* wynik+=zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]; printf("CZWARTE DODANIE: %d\n", zlicz3[zero + 2*(sumy[k]-sumy[j-1])+sumy[i]]); if(sumy[k]-sumy[j-1]==0){ wynik++; printf("KONTRA PIERWSZEGO I DRUGIEGO ODJECIA: 1\n"); }*/ } } } for(j=1;j<=n;j++) for(k=j;k<=n;k++) zlicz1[sumy[k]-sumy[j-1] - sumy[i] + zero]++; zlicz3[sumy[i] + zero]++; } printf("%lld\n", wynik/6); } |