思维题吧,C语言网对java不友好,写成c++就ac了。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
int a[N];
int b[N], to_id[N], idx;
LL l[N], r[N];
LL res;
LL s[N];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++ )
{
cin >> a[i];
s[i] = s[i - 1] + a[i];
if(a[i] > 1)
{
b[ ++ idx] = a[i];
to_id[idx] = i;
}
else
res ++ ;
}
for(int i = 1, j = 0; i <= n; i ++ )
{
if(a[i] == 1)
j ++ ;
else
l[i] = j, j = 0;
}
for(int i = n, j = 0; i >= 1; i -- )
{
if(a[i] == 1)
j ++ ;
else
r[i] = j, j = 0;
}
LL MAX = s[n] + 1;
for(int i = 1; i <= idx; i ++ ) {
LL mul = 1;
for(int j = i; j <= idx; j ++ ) {
mul *= b[j];
if(mul > MAX) break;
int rl = to_id[i];
int rr = to_id[j];
LL cur_s = s[rr] - s[rl - 1];
LL del = mul - cur_s;
if(del == 0)
res ++ ;
else if(del > 0)
{
int l1 = min(del, (LL)l[rl]);
int r1 = min(del, (LL)r[rr]);
res += max(0LL, l1 + r1 - del + 1);
}
}
}
cout << res << endl;
return 0;
}