我们发现对于一个区间最多只能存在一个1,这道题问题我们可以转换为每次求得sumsum值是否在一个范围内,如果可以,说明存在这样的区间满足条件,如果不可以就不存在。这里我们有一个nene数组,ne[i]:ne[i]:下一个非'1'的位置。因为一个区间最多一个1,所以我们可以枚举n个点作为ll,每次ne[l+1]ne[l+1]就是我们的右端点,我们只需要判断目前lrl-r的所有数的乘积是否在[li+1,ri][l-i+1,r-i]这个范围内即可,特别的如果算到当前sumsum已经>n>n了那就直接breakbreak,因为当前一定不满足存在的区间解。

#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
# include<iostream>
# include<iomanip>
# include<algorithm>
# include<cmath>
# include<cstdio>
# include<set>
# include<stack>
# include<queue> 
# include<map>
# include<string>
# include<cstring> 
 
# define eps 1e-9
# define fi first
# define se second
# define ll long long

# define int ll
// cout<<fixed<<setprecision(n) 
using namespace std;
 
typedef unsigned long long ull;
typedef pair<int,int > PII; 
const int mod=1e9+7;
const int MAX=2e5+10;
const int Time=86400;
const int X=131;
const int inf=0x3f3f3f3f;
const double PI = 1e-4;
double pai = 3.14159265358979323846; 

int n,ne[MAX],ans;
char s[MAX];

signed main(){  
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    cin >> s + 1;
    ne[n + 1] = n + 1;
    for(int i = n ; i >= 1 ; i --)
     if(s[i] != '1') ne[i] = i; //初始化ne数组
      else ne[i] = ne[i + 1];
    
    for(int i = 1 ; i <= n ; i ++ ){
		int l , r;
		int sum = 1;
		for(l = i ; l <= n ; l = r){
			sum = sum * (s[l] - '0');
			if(sum > n ) break; //超过n肯定不行直接break
			r = ne[l + 1]; //下一个非'1'的位置
			if(sum >= l - i + 1 && sum <= r - i) ans++; //如果ans在[l-i+1,r-i]范围内
		}
	}
    cout<<ans;
    return 0;
}