#include <bits/stdc++.h>
using namespace std;
int n, a[500010];
long long ans;
char str[500010];
struct node {
  int len, pos;
  long long sum, tag_ch, tag_add;
} t[500010 << 2];
inline void update(int v, int l, int r) {
  int mid = l + r >> 1;
  if (t[v << 1].len > t[v << 1 | 1].len)
    t[v].len = t[v << 1].len, t[v].pos = t[v << 1].pos;
  else
    t[v].len = t[v << 1 | 1].len, t[v].pos = t[v << 1 | 1].pos;
}
inline void pushup(int v, int l, int r) {
  int mid = l + r >> 1;
  t[v].sum = t[v << 1].sum + t[v << 1 | 1].sum;
}
inline void pushdown(int v, int l, int r) {
  int mid = l + r >> 1;
  if (t[v].tag_ch) {
    t[v << 1].tag_ch = t[v << 1 | 1].tag_ch = t[v].tag_ch;
    t[v << 1].sum = t[v].tag_ch * (mid - l + 1);
    t[v << 1 | 1].sum = t[v].tag_ch * (r - mid);
    t[v].tag_ch = 0;
  }
  if (t[v].tag_add) {
    t[v << 1].tag_add += t[v].tag_add;
    t[v << 1 | 1].tag_add += t[v].tag_add;
    t[v << 1].sum += t[v].tag_add * (mid - l + 1);
    t[v << 1 | 1].sum += t[v].tag_add * (r - mid);
    t[v].tag_add = 0;
  }
}
inline void ins(int v, int l, int r, int p_pos) {
  if (l == r) {
    t[v].len = a[l];
    t[v].pos = r;
    return;
  }
  int mid = l + r >> 1;
  if (p_pos <= mid)
    ins(v << 1, l, mid, p_pos);
  else
    ins(v << 1 | 1, mid + 1, r, p_pos);
  update(v, l, r);
}
inline int query(int v, int l, int r, int l_len) {
  if (t[v].len < l_len) return 0;
  if (l == r) return t[v].pos;
  int mid = l + r >> 1;
  if (t[v << 1 | 1].len > l_len) return query(v << 1 | 1, mid + 1, r, l_len);
  return query(v << 1, l, mid, l_len);
}
inline void change(int v, int l, int r, int x, int y, int z) {
  if (x > y) return;
  if (x <= l && r <= y) {
    t[v].tag_add = 0;
    t[v].tag_ch = z;
    t[v].sum = 1ll * z * (r - l + 1);
    return;
  }
  int mid = l + r >> 1;
  pushdown(v, l, r);
  if (x <= mid) change(v << 1, l, mid, x, y, z);
  if (mid < y) change(v << 1 | 1, mid + 1, r, x, y, z);
  pushup(v, l, r);
}
inline void add(int v, int l, int r, int x, int y, int z) {
  if (x > y) return;
  if (x <= l && r <= y) {
    t[v].tag_add += z;
    t[v].sum += 1ll * z * (r - l + 1);
    return;
  }
  int mid = l + r >> 1;
  pushdown(v, l, r);
  if (x <= mid) add(v << 1, l, mid, x, y, z);
  if (mid < y) add(v << 1 | 1, mid + 1, r, x, y, z);
  pushup(v, l, r);
}
int main() {
  scanf("%d%s", &n, str + 1);
  int lst = 0;
  for (int i = 1; i <= n; ++i) {
    if (str[i] == '1') {
      if (lst)
        a[i] = i - lst + 1;
      else
        lst = i, a[i] = 1;
    } else
      lst = 0;
  }
  for (int i = 1; i <= n; ++i) {
    if (str[i] == '1') {
      int pre = query(1, 1, n, a[i]);
      ins(1, 1, n, i);
      if (pre)
        change(1, 1, n, pre - a[i] + 1, i - a[i], a[i]);
      else
        change(1, 1, n, 1, i - a[i], a[i]);
      add(1, 1, n, i - a[i] + 1, i, 1);
    }
    ans += t[1].sum;
  }
  printf("%lld\n", ans);
  return 0;
}
