截断数组
给定一个长度为 n 的数组 a 1 a_1 a1, a 2 a_2 a2…, a n a_n an。
现在,要将该数组从中间截断,得到三个非空子数组。
要求,三个子数组内各元素之和都相等。
请问,共有多少种不同的截断方法?
输入格式
第一行包含整数 n。
第二行包含 n个整数 a 1 a_1 a1, a 2 a_2 a2…, a n a_n an。
输出格式
输出一个整数,表示截断方法数量。
数据范围
前六个测试点满足 1 ≤ n ≤ 10。
所有测试点满足 1 ≤ n ≤
1
0
5
10_5
105,−10000 ≤
a
i
a_i
ai ≤ 10000。
输入样例1:
4
1 2 3 3
输出样例1:
1
输入样例2:
5
1 2 3 4 5
输出样例2:
0
输入样例3:
2
0 0
输出样例3:
0
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N = 100010;
int s[N];
int main()
{
int n;
scanf("%d",&n);
for (int i = 1; i <= n; i ++) //前缀和
{
int x;
scanf("%d",&x);
s[i] = s[i - 1] + x;
}
if(s[n] % 3) puts("0"); //特判,总和不为3的倍数
else
{
LL res = 0, cnt = 0;
for (int i = 3; i <= n; i ++)
{
if (s[i - 2] == s[n] / 3) cnt ++; // 符合第一刀的数目
if (s[n] - s[i - 1] == s[n] / 3) res += cnt; //符合第二刀的情况下累加第一刀的情况
}
printf("%lld\n", res);
}
}