【CF】466C Number of Ways 预处理
用sum[i]表示前i项的和
由题可知
sum[n]=sum[i]*3;
所以先统计sum[n]/3*2的值的个数
然后计算
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #define cler(arr, val) memset(arr, val, sizeof(arr)) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 566666;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 0x3f3f3f3f; const int mod = 10000007; LL sum[MAXN]; int main() { int n; scanf("%d",&n); sum[0]=0; for(int i=1; i<=n; i++) { scanf("%I64d",&sum[i]); sum[i]+=sum[i-1]; } if(sum[n]%3) { puts("0"); return 0; } LL ans=0,val=0; for(int i=2; i<n; i++) { if(sum[i]==sum[n]/3*2) val++; } for(int i=2; i<n; i++) { if(sum[i-1]==sum[n]/3) ans+=val; if(sum[i]==sum[n]/3*2) val--; } printf("%I64d\n",ans); }