Number of Ways

来源:互联网 发布:大秦铁路 知乎 编辑:程序博客网 时间:2024/06/16 18:50

You've got array a[1], a[2], ..., a[n], consisting of n integers. Count the number of ways to split all the elements of the array into three contiguous parts so that the sum of elements in each part is the same.

More formally, you need to find the number of such pairs of indices i, j (2 ≤ i ≤ j ≤ n - 1), that .

Input

The first line contains integer n (1 ≤ n ≤ 5·105), showing how many numbers are in the array. The second line contains n integers a[1]a[2], ..., a[n] (|a[i]| ≤  109)— the elements of array a.

Output

Print a single integer — the number of ways to split the array into three parts with the same sum.

Example
Input
51 2 3 0 3
Output
2
Input
40 1 -1 0
Output
1
Input
24 1
Output

需要注意的是一倍结点和两倍结点为0时的情况,不要以为当发现一倍结点只要赋值为1就可以,一倍 结点也需要记录数量。

以后的自己如果不懂就推算一下。

0 1 -1 0 0

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int MAX = 520000;long long a[MAX];int main() {   int n;   int x;   scanf("%d",&n);   a[0] = 0;      for(int i = 1; i <= n ; i++){        scanf("%d",&x);        a[i] = a[i-1] + x;    }long long  flag ,flag1;flag = flag1 = 0;if(a[n]%3 == 0){long long k = a[n]/3;long long m = a[n]/3 * 2;for(int i = 1; i < n; i++){    if(a[i] == m)    flag1 += flag;    if(a[i] == k)    flag++;   }}cout << flag1;return 0;}

原创粉丝点击