#nullable enable #region var _input = Array.Empty(); var _iter = 0; string String() { while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0); return _input[_iter++]; } T I() where T : IParsable => T.Parse(String(), null); #endregion var n = I(); var a = I(); var s = String().Select(c => c - '0').ToArray(); var ss = new int[n * 2 + 1]; for (var i = 1; i <= n * 2; i++) ss[i] = ss[i - 1] + s[i % n]; var nexts = new int[n]; nexts.AsSpan().Fill(-1); long G(int p, long k) { var dk = ss[p + n] - ss[p]; var rep = k / dk; k -= rep * dk; return rep * n + F(p, k, 1); } long F(int p, long k, int last) { if (last < 2 && nexts[p] >= 0) { var t = p; var res = 0L; var sdk = 0; while (true) { var next = nexts[t]; var dk = ss[next] - ss[t]; if (next <= t) dk = ss[next + n] - ss[t]; dk--; if (dk >= k) return res + F(t, k, 2); k -= dk; sdk += dk; res += next - t; if (next <= t) res += n; t = next; if (t == p) break; } var rep = k / sdk; res *= rep + 1; k -= rep * sdk; if (k == 0) return res; return res + F(p, k, last); } var r = 1200; var i = 0; var j = p; while (true) { if (last < 2 && i >= n) break; if (r > 1200) { nexts[p] = j; var d = j - p; if (d <= 0) d += n; return F(j, k, last) + d; } if (s[j] == 0) r--; else { if (r < 1200) k--; r++; if (k == 0) return i + 1; } j++; if (j == n) j = 0; } return G(p, k) + n; } var ans = F(0, a, 0); Console.WriteLine(ans);