C. Number of Ways
题意:一个数列a1~an,需要把它分割成连续的三段,且每段的和相等。求有多少种分法。
思路:开一个数组存前i项和,如果数列的和能被3整除的话,算出总和sum(n)的1/3和2/3。扫一遍前i项和,如果发现sum(i)值为总和的1/3,则计数;如果发现sum(i)的值为总和的2/3,那么说明以i结尾作第二段分割的分法等于1~i中sum(x)==1/3*sum(n)的数量。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define INF 10000000000LL
#define ll long long
#define max3(a,b,c) max(a,max(b,c))
using namespace std;
ll num[500010];
ll sum[500010];
int main(){
int n;
while(cin>>n){
ll cnt=0;
ll ans=0;
sum[0]=0;
for(int i=1;i<=n;i++){
scanf("%I64d",&num[i]);
sum[i]=sum[i-1]+num[i];
}
if((sum[n]%3)==0){
ll tri=sum[n]/3;
for(int i=1;i<n;i++){
if(i!=1&&sum[i]==2*tri){
ans+=cnt;
}
if(sum[i]==tri)cnt++;
}
cout<<ans<<endl;
}else{
cout<<0<<endl;
}
}
return 0;
}