P12708 [KOI 2021 Round 1] 分割

题目背景

试题来源:。中文翻译做了少量本土化修改。 按照[署名—非商业性使用—相同方式共享 4.0 协议国际版](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans)进行授权。

题目描述

给定一个由 $N$ 个整数组成的数列 $A_1, A_2, \ldots, A_N$。我们想将该数列划分为连续的四个部分,每个部分至少包含一个数,且每一部分的数字之和必须相等。 也就是说,存在整数 $i, j, k$(满足 $1 \leq i < j < k < N$),使得将数列划分为以下四段: - $[A_1, \ldots, A_i]$ - $[A_{i+1}, \ldots, A_j]$ - $[A_{j+1}, \ldots, A_k]$ - $[A_{k+1}, \ldots, A_N]$ 例如,若给定的数列是: $$4, -1, 2, 1, -3, 1, 2, 2, 1, 3$$ 若分成以下四段: $$[4, -1, 2], [1, -3, 1, 2], [2, 1], [3]$$ 则每部分的和不同,不符合条件。 若分为: $$[4, -1], [2, 1], [-3, 1, 2, 2, 1], [3]$$ 则每一部分的和都相同,符合条件。 以下划分方式也符合条件: - $[4, -1], [2, 1, -3, 1, 2], [2, 1], [3]$ - $[4, -1, 2, 1, -3], [1, 2], [2, 1], [3]$ 请你编写一个程序,输入数列,计算上述方式下,满足要求的不同划分方法的总数。

输入格式

第一行输入整数 $N$。 第二行输入 $N$ 个整数 $A_1, A_2, \ldots, A_N$,用空格隔开。

输出格式

输出满足条件的划分方法总数,占据一行。 (提示:输出结果可能很大,请在 C/C++ 中使用 `long long` 类型,在 Java 中使用 `long` 类型。)

说明/提示

**约束条件** - $4 \leq N \leq 100\,000$ - 对所有 $1 \leq i \leq N$,有 $-1\,000 \leq A_i \leq 1\,000$ **子任务** 1. (5 分)所有 $A_i = 0$ 2. (7 分)所有 $A_i > 0$ 3. (4 分)所有 $A_i \geq 0$ 4. (11 分)$N \leq 10$ 5. (19 分)$N \leq 500$ 6. (23 分)$N \leq 5\,000$ 7. (31 分)无附加约束条件