题目链接:cf 466c
给定一个数字串,问有多少种分法,把整个数字串分为三段,三段的和都相等
求出总和all,然后找all/3的点与all/3*2的点,累加其值即可求解
/******************************************************
* File Name: c.cpp
* Author: kojimai
* Creater Time:2014年09月12日 星期五 23时59分02秒
******************************************************/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 500005
long long a[FFF];
long long sum[FFF];
int main()
{
int n;
cin>>n;
sum[0]=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum[i] = sum[i-1]+a[i];
}
if(n==1)
{
cout<<0<<endl;
}
else
{
long long all=sum[n];
if(all%3!=0)
{
cout<<0<<endl;
}
else if(all)
{
long long a1=all/3;
long long a2=all/3*2;
int cnt=0;
long long ans=0;
for(int i=1;i<=n;i++)
{
if(sum[i]==a2)
ans += cnt;
if(sum[i]==a1)
cnt++;
}
cout<<ans<<endl;
}
else
{
long long cnt=0;
for(int i=1;i<=n;i++)
{
if(sum[i]==0)
cnt++;
}
cout<<(cnt-1)*(cnt-2)/2<<endl;
}
}
return 0;
}