#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = (a), _##i = (b); i <= _##i; ++i)
#define per(i, a, b) for (int i = (a), _##i = (b); i >= _##i; --i)
#define vi vector <int>
#define vii vector <pii >
#define vl vector <ll>
#define vb vector <bool >
#define eb emplace_back
#define pb push_back
#define pii pair <int, int>
#define vt vector <vi >
#define vtv vector <vii >
#define all(a, i) a.begin() + i, a.end()
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
// 001001
ll ans = 0, sum = 0;
ll num0, sum0, num1, sum1;
void solve() {
int n;
cin >> n;
string s;
cin >> s;
s = " " + s + s;
// sum 维护以即将被去除的滑动窗口签的那一个字符为开头的0/1个数
// sum1 维护最大区间所有区间的0/1个数
// sum0 维护 当前窗口组合含0的子序列的方法数
rep(i, 1, n) {
if (s[i] == '0') num0++, sum0 += i;
else num1++, sum1 += sum0, sum += num0;
}
rep(i, n + 1, 2 * n) {
// 这里也是减去 i - n 作为边界的贡献
sum1 -= sum;
// 把 i - n 作为边界的贡献减去
sum0 -= num0;
//如果去掉一个 0 那么 sum 会变化, num0 会变化
if (s[i - n] == '0') num0--, sum -= num1;
else num1--;
if (s[i] == '0') num0++, sum0 += n;
else num1++, sum1 += sum0, sum += num0;
ans += sum1;
ans %= mod;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}