#include<cstdio> #include<vector> using namespace std; long long sumy[505]; long long zlicz_dodatnie[500 * 20000 + 5]; long long zlicz_ujemne[500 * 20000 + 5]; long long podwojone_zlicz_dodatnie[2 * 500 * 20000 + 5]; long long podwojone_zlicz_ujemne[2 * 500 * 20000 + 5]; int main() { int n; scanf("%d", &n); vector<long long> dane; vector<long long> buc; vector<long long> dodatnie; vector<long long> ujemne; long long liczba_zer = 0; long long liczba_dodatnich = 0; long long liczba_ujemnych = 0; long long d; for (int i = 0; i < n; i++) { scanf("%lld", &d); dane.push_back(d); sumy[i + 1] = sumy[i] + d; } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { long long calc = sumy[j] - sumy[i - 1]; //for (long long calc : dane) { buc.push_back(calc); if (calc > 0) { if (zlicz_dodatnie[calc] == 0) { dodatnie.push_back(calc); } zlicz_dodatnie[calc]++; liczba_dodatnich++; } else if (calc == 0) { liczba_zer++; } else { if (zlicz_ujemne[-calc] == 0) { ujemne.push_back(calc); } zlicz_ujemne[-calc]++; liczba_ujemnych++; } } } long long result = 0; // 3 zera if (liczba_zer >= 3) { result += liczba_zer * (liczba_zer - 1) / 2 * (liczba_zer - 2) / 3; } // 1 zero, 1 dodatnia, 1 ujemna if (liczba_zer > 0) { for (long long ax : dodatnie) { result += liczba_zer * zlicz_dodatnie[ax] * zlicz_ujemne[ax]; } } // 1 dodatnia, 2 ujemne if (liczba_dodatnich > 0 && liczba_ujemnych > 1) { for (int i = 0; i < ujemne.size(); i++) { for (int j = i; j < ujemne.size(); j++) { if (i == j) { podwojone_zlicz_ujemne[-ujemne[i] - ujemne[j]] += (zlicz_ujemne[-ujemne[i]]) * (zlicz_ujemne[-ujemne[i]] - 1) / 2; } else { podwojone_zlicz_ujemne[-ujemne[i] - ujemne[j]] += (zlicz_ujemne[-ujemne[i]]) * (zlicz_ujemne[-ujemne[j]]); } } } for (long long ax : dodatnie) { //printf("A: ax = %lld, dod[ax] = %lld pod[ax] = %lld\n", ax, zlicz_dodatnie[ax], podwojone_zlicz_ujemne[ax]); result += zlicz_dodatnie[ax] * podwojone_zlicz_ujemne[ax]; } } // 2 dodatnie, 1 ujemna if (liczba_dodatnich > 1 && liczba_ujemnych > 0) { for (int i = 0; i < dodatnie.size(); i++) { for (int j = i; j < dodatnie.size(); j++) { if (i == j) { podwojone_zlicz_dodatnie[dodatnie[i] + dodatnie[j]] += (zlicz_dodatnie[dodatnie[i]]) * (zlicz_dodatnie[dodatnie[i]] - 1) / 2; } else { podwojone_zlicz_dodatnie[dodatnie[i] + dodatnie[j]] += (zlicz_dodatnie[dodatnie[i]]) * (zlicz_dodatnie[dodatnie[j]]); } } } for (long long ax : ujemne) { //printf("B: -ax = %lld, uje[ax] = %lld pod[ax] = %lld\n", -ax, zlicz_ujemne[-ax], podwojone_zlicz_dodatnie[-ax]); result += zlicz_ujemne[-ax] * podwojone_zlicz_dodatnie[-ax]; } } //for (auto i : buc) { // printf("%lld ", i); //} //printf("\n"); printf("%lld", result); return 0; }
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | #include<cstdio> #include<vector> using namespace std; long long sumy[505]; long long zlicz_dodatnie[500 * 20000 + 5]; long long zlicz_ujemne[500 * 20000 + 5]; long long podwojone_zlicz_dodatnie[2 * 500 * 20000 + 5]; long long podwojone_zlicz_ujemne[2 * 500 * 20000 + 5]; int main() { int n; scanf("%d", &n); vector<long long> dane; vector<long long> buc; vector<long long> dodatnie; vector<long long> ujemne; long long liczba_zer = 0; long long liczba_dodatnich = 0; long long liczba_ujemnych = 0; long long d; for (int i = 0; i < n; i++) { scanf("%lld", &d); dane.push_back(d); sumy[i + 1] = sumy[i] + d; } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { long long calc = sumy[j] - sumy[i - 1]; //for (long long calc : dane) { buc.push_back(calc); if (calc > 0) { if (zlicz_dodatnie[calc] == 0) { dodatnie.push_back(calc); } zlicz_dodatnie[calc]++; liczba_dodatnich++; } else if (calc == 0) { liczba_zer++; } else { if (zlicz_ujemne[-calc] == 0) { ujemne.push_back(calc); } zlicz_ujemne[-calc]++; liczba_ujemnych++; } } } long long result = 0; // 3 zera if (liczba_zer >= 3) { result += liczba_zer * (liczba_zer - 1) / 2 * (liczba_zer - 2) / 3; } // 1 zero, 1 dodatnia, 1 ujemna if (liczba_zer > 0) { for (long long ax : dodatnie) { result += liczba_zer * zlicz_dodatnie[ax] * zlicz_ujemne[ax]; } } // 1 dodatnia, 2 ujemne if (liczba_dodatnich > 0 && liczba_ujemnych > 1) { for (int i = 0; i < ujemne.size(); i++) { for (int j = i; j < ujemne.size(); j++) { if (i == j) { podwojone_zlicz_ujemne[-ujemne[i] - ujemne[j]] += (zlicz_ujemne[-ujemne[i]]) * (zlicz_ujemne[-ujemne[i]] - 1) / 2; } else { podwojone_zlicz_ujemne[-ujemne[i] - ujemne[j]] += (zlicz_ujemne[-ujemne[i]]) * (zlicz_ujemne[-ujemne[j]]); } } } for (long long ax : dodatnie) { //printf("A: ax = %lld, dod[ax] = %lld pod[ax] = %lld\n", ax, zlicz_dodatnie[ax], podwojone_zlicz_ujemne[ax]); result += zlicz_dodatnie[ax] * podwojone_zlicz_ujemne[ax]; } } // 2 dodatnie, 1 ujemna if (liczba_dodatnich > 1 && liczba_ujemnych > 0) { for (int i = 0; i < dodatnie.size(); i++) { for (int j = i; j < dodatnie.size(); j++) { if (i == j) { podwojone_zlicz_dodatnie[dodatnie[i] + dodatnie[j]] += (zlicz_dodatnie[dodatnie[i]]) * (zlicz_dodatnie[dodatnie[i]] - 1) / 2; } else { podwojone_zlicz_dodatnie[dodatnie[i] + dodatnie[j]] += (zlicz_dodatnie[dodatnie[i]]) * (zlicz_dodatnie[dodatnie[j]]); } } } for (long long ax : ujemne) { //printf("B: -ax = %lld, uje[ax] = %lld pod[ax] = %lld\n", -ax, zlicz_ujemne[-ax], podwojone_zlicz_dodatnie[-ax]); result += zlicz_ujemne[-ax] * podwojone_zlicz_dodatnie[-ax]; } } //for (auto i : buc) { // printf("%lld ", i); //} //printf("\n"); printf("%lld", result); return 0; } |