Number of Ways
Input
5
1 2 3 0 3
output
2
Input
4
0 1 -1 0
Output
1
Input
2
4 1
Output
0
思路:(枚举中间快,在枚举时,顺便保存第一块的可能个数)
本题是前缀和。sum=pre【n】
能用乘法就别用除法。
- 当pre【i】*3=sum时,说明可能时第一个点,即ret++;
- 当pre【i】* 3=sum * 2
(此时 i 的位置以后可以满足条件,把这时的 i 作为 j ) - 因为前面已经统计过了有多少个满足的i点,累加即可。
ans+=ret;
#include <iostream>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
#define foR(i,x,y) for(register int i=(x); i>=(y); i--)
using namespace std;
const int maxn=5e5+10;
typedef long long ll;
ll pre[maxn],a,sum;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;
cin>>n;
For(i,1,n)
{
cin>>a;
pre[i]=pre[i-1]+a;
}
sum=pre[n];
ll ans=0,ret=0;
For(i,1,n-1)
{
if(pre[i]*3==sum*2)
ans+=ret;
if(pre[i]*3==sum)
ret++;
}
cout<<ans<<endl;
return 0;
}