#include <bits/stdc++.h>
using namespace std;
#define ll long long int
int countWaysToDivideIntoFourParts(vector<int>& nums) {
int n = nums.size();
// Step 1: Compute total sum
int totalSum = accumulate(nums.begin(), nums.end(), 0);
// If total sum is not divisible by 4, return 0
if (totalSum % 4 != 0) return 0;
int y = totalSum / 4; // Each part must sum to 'y'
int x = 2 * y; // Two parts combined to form half the total
// Step 2: Compute postfix sums and store their occurrences
vector<int> post(n);
unordered_map<int, int> postMap; // HashMap for storing postfix sum counts
post[n - 1] = nums[n - 1];
postMap[post[n - 1]] = 1;
for (int i = n - 2; i >= 0; i--) {
post[i] = post[i + 1] + nums[i];
postMap[post[i]]++;
}
// Step 3: Iterate to find valid partitions
int prefixSum = nums[0] + nums[1]; // Start with first two elements
unordered_map<int, int> prefixMap; // HashMap for prefix sums
prefixMap[nums[0]] = 1;
prefixMap[prefixSum]++;
postMap[post[0]]--; // Remove total sum from postMap
postMap[post[1]]--;
int result = 0;
for (int i = 2; i < n; i++) {
prefixSum += nums[i];
prefixMap[prefixSum]++;
postMap[post[i]]--;
// If prefix sum matches 2y, check valid partitions
if (prefixSum == x) {
int leftWays = prefixMap[y]; // Count of sum = y in left part
int rightWays = postMap[y]; // Count of sum = y in right part
result += leftWays * rightWays; // Multiply both for valid ways
}
}
return result;
}
int main() {
vector<int> nums = {4, 2, 1, 0, -1, 1, 7, 3, 3, 1, -3, 3, 7};
cout << countWaysToDivideIntoFourParts(nums) << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludAoKaW50IGNvdW50V2F5c1RvRGl2aWRlSW50b0ZvdXJQYXJ0cyh2ZWN0b3I8aW50PiYgbnVtcykgewogICAgaW50IG4gPSBudW1zLnNpemUoKTsKICAgIAogICAgLy8gU3RlcCAxOiBDb21wdXRlIHRvdGFsIHN1bQogICAgaW50IHRvdGFsU3VtID0gYWNjdW11bGF0ZShudW1zLmJlZ2luKCksIG51bXMuZW5kKCksIDApOwogICAgCiAgICAvLyBJZiB0b3RhbCBzdW0gaXMgbm90IGRpdmlzaWJsZSBieSA0LCByZXR1cm4gMAogICAgaWYgKHRvdGFsU3VtICUgNCAhPSAwKSByZXR1cm4gMDsKCiAgICBpbnQgeSA9IHRvdGFsU3VtIC8gNDsgICAvLyBFYWNoIHBhcnQgbXVzdCBzdW0gdG8gJ3knCiAgICBpbnQgeCA9IDIgKiB5OyAgICAgICAgICAvLyBUd28gcGFydHMgY29tYmluZWQgdG8gZm9ybSBoYWxmIHRoZSB0b3RhbAoKICAgIC8vIFN0ZXAgMjogQ29tcHV0ZSBwb3N0Zml4IHN1bXMgYW5kIHN0b3JlIHRoZWlyIG9jY3VycmVuY2VzCiAgICB2ZWN0b3I8aW50PiBwb3N0KG4pOwogICAgdW5vcmRlcmVkX21hcDxpbnQsIGludD4gcG9zdE1hcDsgLy8gSGFzaE1hcCBmb3Igc3RvcmluZyBwb3N0Zml4IHN1bSBjb3VudHMKCiAgICBwb3N0W24gLSAxXSA9IG51bXNbbiAtIDFdOwogICAgcG9zdE1hcFtwb3N0W24gLSAxXV0gPSAxOwogICAgCiAgICBmb3IgKGludCBpID0gbiAtIDI7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgcG9zdFtpXSA9IHBvc3RbaSArIDFdICsgbnVtc1tpXTsKICAgICAgICBwb3N0TWFwW3Bvc3RbaV1dKys7CiAgICB9CgogICAgLy8gU3RlcCAzOiBJdGVyYXRlIHRvIGZpbmQgdmFsaWQgcGFydGl0aW9ucwogICAgaW50IHByZWZpeFN1bSA9IG51bXNbMF0gKyBudW1zWzFdOyAgLy8gU3RhcnQgd2l0aCBmaXJzdCB0d28gZWxlbWVudHMKICAgIHVub3JkZXJlZF9tYXA8aW50LCBpbnQ+IHByZWZpeE1hcDsgIC8vIEhhc2hNYXAgZm9yIHByZWZpeCBzdW1zCgogICAgcHJlZml4TWFwW251bXNbMF1dID0gMTsKICAgIHByZWZpeE1hcFtwcmVmaXhTdW1dKys7CgogICAgcG9zdE1hcFtwb3N0WzBdXS0tOyAvLyBSZW1vdmUgdG90YWwgc3VtIGZyb20gcG9zdE1hcAogICAgcG9zdE1hcFtwb3N0WzFdXS0tOwoKICAgIGludCByZXN1bHQgPSAwOwoKICAgIGZvciAoaW50IGkgPSAyOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgcHJlZml4U3VtICs9IG51bXNbaV07CiAgICAgICAgcHJlZml4TWFwW3ByZWZpeFN1bV0rKzsKICAgICAgICBwb3N0TWFwW3Bvc3RbaV1dLS07CgogICAgICAgIC8vIElmIHByZWZpeCBzdW0gbWF0Y2hlcyAyeSwgY2hlY2sgdmFsaWQgcGFydGl0aW9ucwogICAgICAgIGlmIChwcmVmaXhTdW0gPT0geCkgewogICAgICAgICAgICBpbnQgbGVmdFdheXMgPSBwcmVmaXhNYXBbeV07IC8vIENvdW50IG9mIHN1bSA9IHkgaW4gbGVmdCBwYXJ0CiAgICAgICAgICAgIGludCByaWdodFdheXMgPSBwb3N0TWFwW3ldOyAgLy8gQ291bnQgb2Ygc3VtID0geSBpbiByaWdodCBwYXJ0CiAgICAgICAgICAgIHJlc3VsdCArPSBsZWZ0V2F5cyAqIHJpZ2h0V2F5czsgLy8gTXVsdGlwbHkgYm90aCBmb3IgdmFsaWQgd2F5cwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxpbnQ+IG51bXMgPSB7NCwgMiwgMSwgMCwgLTEsIDEsIDcsIDMsIDMsIDEsIC0zLCAzLCA3fTsKICAgIGNvdXQgPDwgY291bnRXYXlzVG9EaXZpZGVJbnRvRm91clBhcnRzKG51bXMpIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=