#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; }