#include <bits/stdc++.h>
using namespace std;
long long n;
long long pre[500011];
string s;
long long st[500011 << 2];
long long mx[500011 << 2];
long long mn[500011 << 2];
long long dt[500011 << 2];
void push(long long p, long long l, long long r) {
  if (dt[p] == 0) return;
  st[p] += dt[p] * (r - l + 1);
  mx[p] += dt[p];
  mn[p] += dt[p];
  if (r > l) {
    long long P = p << 1;
    dt[P] += dt[p];
    dt[P | 1] += dt[p];
  }
  dt[p] = 0;
}
void updateAdd(long long p, long long l, long long r, long long i,
               long long j) {
  push(p, l, r);
  if (l > j or r < i or i > j) return;
  if (l >= i and r <= j) {
    dt[p]++;
    push(p, l, r);
  } else {
    long long m = (l + r) >> 1;
    long long P = p << 1;
    updateAdd(P, l, m, i, j);
    updateAdd(P | 1, m + 1, r, i, j);
    st[p] = st[P] + st[P | 1];
    mx[p] = max(mx[P], mx[P | 1]);
    mn[p] = min(mn[P], mn[P | 1]);
  }
}
void updateMax(long long p, long long l, long long r, long long i, long long j,
               long long k) {
  push(p, l, r);
  if (l > j or r < i or i > j or mn[p] >= k) return;
  if (l >= i and r <= j and mx[p] < k) {
    dt[p]++;
    push(p, l, r);
  } else {
    long long m = (l + r) >> 1;
    long long P = p << 1;
    updateMax(P, l, m, i, j, k);
    updateMax(P | 1, m + 1, r, i, j, k);
    st[p] = st[P] + st[P | 1];
    mx[p] = max(mx[P], mx[P | 1]);
    mn[p] = min(mn[P], mn[P | 1]);
  }
}
long long query() {
  push(1, 0, n - 1);
  return st[1];
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> s;
  for (long long i = 0; i < n; i++) {
    if (s[i] == '0') continue;
    if (i > 0 and s[i - 1] == '1')
      pre[i] = pre[i - 1];
    else
      pre[i] = i;
  }
  long long ans = 0;
  for (long long i = 0; i < n; i++) {
    if (s[i] == '1') {
      long long prev = pre[i];
      updateAdd(1, 0, n - 1, prev, i);
      long long l = i - prev + 1;
      updateMax(1, 0, n - 1, 0, prev - 1, l);
    }
    ans += query();
  }
  cout << ans << endl;
  return 0;
}
