#include <bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define sn second typedef long long ll; typedef vector<int> VI; typedef vector<char> VC; typedef pair<int, int> PI; typedef map<int, int> MI; const ll MOD = 1000000000 + 9; int main() { int n; cin >> n; VI A(n + 1); VI prefsum(n + 1); ll result = 0; VI M; MI mp; prefsum[0] = 0; for (int i = 1; i <= n; i++) { cin >> A[i]; } for (int i = 1; i <= n; i++) { prefsum[i] = prefsum[i - 1] + A[i]; } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { M.push_back(prefsum[j] - prefsum[i - 1]); } } // cout << M[0] << " "; for (int i = 1; i < M.size(); i++) { // cout << M[i] << " "; int missing = 0 - M[i]; if (mp.find(missing) != mp.end()) { result += mp[missing]; result %= MOD; } for (int j = 0; j < i; j++) { mp[M[i] + M[j]] += 1; } } // cout << endl; // for (int i0 = 1; i0 <= n; i0++) { // for (int l = 1; i0 + l - 1 <= n; l++) { // int i5 = i0 + l - 1; // for (int i1 = i0 + 1; i1 <= i5; i1++) { // int a1 = prefsum[i1] - prefsum[i0 - 1]; // int len_a1 = i1 - i0 + 1; // if (a1 == 0) { // result += ((len_a1 - 1) * (len_a1 - 2)) / 2; // result %= MOD; // } // for (int i2 = i1 + 1; i2 <= i5; i2++) { // for (int i3 = i2 + 1; i3 <= i5; i3++) { // int a2 = prefsum[i1 - 1] - prefsum[i0 - 1]; // int c2 = prefsum[i3] - prefsum[i2 - 1]; // int len_a2 = i1 - i0; // int len_c2 = i3 - i0 + 1; // if (a2 + c2 == 0) { // result += ((len_a2 - 1) + (len_c2 - 1)); // result %= MOD; // } // for (int i4 = i3 + 1; i4 <= i5; i4++) { // int a3 = prefsum[i1 - 1] - prefsum[i0 - 1]; // // int len_a = i1-i0; // // int b3 = prefsum[i2 - 1] - prefsum[i1 - 1]; // int c3 = prefsum[i3 - 1] - prefsum[i2 - 1]; // // int len_c = i3-i2; // // int d3 = prefsum[i4 - 1] - prefsum[i3 - 1]; // int e3 = prefsum[i5] - prefsum[i4 - 1]; // // int len_e = i5-i4+1; // if (a3 + c3 + e3 == 0) { // result += 1; // result %= MOD; // } // } // } // } // } // } // } cout << result << endl; 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 | #include <bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define sn second typedef long long ll; typedef vector<int> VI; typedef vector<char> VC; typedef pair<int, int> PI; typedef map<int, int> MI; const ll MOD = 1000000000 + 9; int main() { int n; cin >> n; VI A(n + 1); VI prefsum(n + 1); ll result = 0; VI M; MI mp; prefsum[0] = 0; for (int i = 1; i <= n; i++) { cin >> A[i]; } for (int i = 1; i <= n; i++) { prefsum[i] = prefsum[i - 1] + A[i]; } for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { M.push_back(prefsum[j] - prefsum[i - 1]); } } // cout << M[0] << " "; for (int i = 1; i < M.size(); i++) { // cout << M[i] << " "; int missing = 0 - M[i]; if (mp.find(missing) != mp.end()) { result += mp[missing]; result %= MOD; } for (int j = 0; j < i; j++) { mp[M[i] + M[j]] += 1; } } // cout << endl; // for (int i0 = 1; i0 <= n; i0++) { // for (int l = 1; i0 + l - 1 <= n; l++) { // int i5 = i0 + l - 1; // for (int i1 = i0 + 1; i1 <= i5; i1++) { // int a1 = prefsum[i1] - prefsum[i0 - 1]; // int len_a1 = i1 - i0 + 1; // if (a1 == 0) { // result += ((len_a1 - 1) * (len_a1 - 2)) / 2; // result %= MOD; // } // for (int i2 = i1 + 1; i2 <= i5; i2++) { // for (int i3 = i2 + 1; i3 <= i5; i3++) { // int a2 = prefsum[i1 - 1] - prefsum[i0 - 1]; // int c2 = prefsum[i3] - prefsum[i2 - 1]; // int len_a2 = i1 - i0; // int len_c2 = i3 - i0 + 1; // if (a2 + c2 == 0) { // result += ((len_a2 - 1) + (len_c2 - 1)); // result %= MOD; // } // for (int i4 = i3 + 1; i4 <= i5; i4++) { // int a3 = prefsum[i1 - 1] - prefsum[i0 - 1]; // // int len_a = i1-i0; // // int b3 = prefsum[i2 - 1] - prefsum[i1 - 1]; // int c3 = prefsum[i3 - 1] - prefsum[i2 - 1]; // // int len_c = i3-i2; // // int d3 = prefsum[i4 - 1] - prefsum[i3 - 1]; // int e3 = prefsum[i5] - prefsum[i4 - 1]; // // int len_e = i5-i4+1; // if (a3 + c3 + e3 == 0) { // result += 1; // result %= MOD; // } // } // } // } // } // } // } cout << result << endl; return 0; } |