#include using namespace std; typedef pair pii; typedef long long ll; const int N = 2000086, MOD = 998244353, INF = 0x3f3f3f3f; ll res; int n, m, cnt, w[N]; struct ST { struct Node { int l, r; ll sum; }; vector tr; ST(ST&& other) noexcept : tr(move(other.tr)) { } ST (int l, int r) : tr(vector(((r - l) << 2) + 10)) { build(1, l, r); } ST& operator=(ST&& other) noexcept { if (this != &other) { tr = move(other.tr); } return *this; } private: void pushup(int u) { tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum; } void build(int u, int l, int r) { tr[u] = {l, r}; if (l == r) return; int mid = l + r >> 1; build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r); pushup(u); } public: ll query(int u, int l, int r) { if (tr[u].l >= l && tr[u].r <= r) return tr[u].sum; int mid = tr[u].l + tr[u].r >> 1; ll res = 0; if (l <= mid) res += query(u << 1, l, r); if (r > mid) res += query(u << 1 | 1, l, r); return res; } void modify(int u, int x, int v) { if (tr[u].l == tr[u].r) tr[u].sum += v; else { int mid = tr[u].l + tr[u].r >> 1; if (x <= mid) modify(u << 1, x, v); else modify(u << 1 | 1, x, v); pushup(u); } } }; char s[N]; ll k; int f[N]; int main() { ST tr(-400000, 1200); cin >> n >> k; scanf("%s", s + 1); int c0 = 0; for (int i = 1; i < n + 1; i++) { if (s[i] == '0') c0++; else { int l = -200000, r = 1200; while (l < r) { int mid = l + r + 1 >> 1; if (mid - c0 + tr.query(1, mid, 1200) < 1200) l = mid; else r = mid - 1; } f[i] = l; tr.modify(1, l, 1); } } int now = 1200; ll t = 0; vector v = {{1200, 0}}; set st = {1200}; while (1) { int c = tr.query(1, now, 1200); if (t + c >= k) { for (int i = 1; i < n + 1; i++) { t += f[i] >= now; if (t == k) { printf("%lld\n", res + i); return 0; } } assert(0); } int ne = now + c - c0; if (st.count(ne)) { for (int i = 0; i < v.size(); i++) if (v[i].first == ne) { ll g = 0, len = 0; v.push_back({ne, c}); for (int j = i + 1; j < v.size(); j++) g += v[j].second, len++; t += c, res += n; res += (k - t) / g * n * len; t += (k - t) / g * g; if (t == k) res -= n * len, t -= g; for (int j = i + 1; j < v.size(); j++) { if (t + v[j].second < k) t += v[j].second; else { for (int l = 1; l < n + 1; l++) { t += f[l] >= v[j - 1].first; if (t == k) { printf("%lld\n", res + l); return 0; } } } } assert(0); } assert(0); } else if (c == n - c0 && ne < now) { ll g = (k - t) % c; if (!g) g += c; res += (k - t) / c * n; t += (k - t) / c * c; if (t == k) res -= n, t -= c; for (int i = 1; i < n + 1; i++) { t += s[i] == '1'; if (t == k) { printf("%lld\n", res + i); return 0; } } assert(0); } else { v.push_back({ne, c}); st.insert(ne); t += c; now = ne; } res += n; } return 0; }