题意
一串数字,分割成三个相同部分的和有多少种方法?
考虑前缀和? 那么若其前缀为
2∗k
2
∗
k
大小的话,则种类个数
++
+
+
知道遇到前缀为
k
k
<script type="math/tex" id="MathJax-Element-47">k</script>的情况加上
AC代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define CLR(a,b) memset(a,(b),sizeof(a))
#define ls st<<1
#define rs st<<1|1
const int INF = 0x3f3f3f3f;
const int MAXN = (int)2e5+10;
const int mod = (int)1e9+7;
int arr[MAXN];
map<int, int> mp;
int a[MAXN], b[MAXN], c[MAXN];
ll sum[MAXN];
int main() {
int n, x;
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> x;
sum[i] = sum[i-1]+x;
}
ll k = sum[n]/3;
if(k*3 != sum[n]) {
cout << "0\n";
return 0;
}
ll kk = 0, ans = 0;
for(int i = n-1; i >= 1; --i) {
if(sum[i] == k) ans += kk;
if(sum[i] == 2*k) kk++;
}
cout << ans << endl;
return 0;
}