typedeflonglong ll; ll ans, n, k; inline ll read() { ll x(0); charo(getchar()); while (o < '0' || o > '9') o = getchar(); for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x; }
inline ll C(ll p) { if (p == 1) return0; return1ll * p * (p - 1) / 2; }
inlineboolcheck(ll p) { if (C(p) > k) return0; if (n == p) returnC(p) == k; return1ll * C(p) + 1ll * p * (n - p) >= k; }
intmain() { freopen ("game.in", "r", stdin); freopen ("game.out", "w", stdout); n = read(), k = read(); if (k == 0 || C(n) < k) returnputs("-1") & 0; if (k < n) ans = C(n - 1); ll l(1), r(n), pr(n + 1), pl(n); while (l <= r) { ll mid = (l + r) >> 1; if (C(mid) <= k) pr = mid, l = mid + 1; else r = mid - 1; } l = 1, r = pr; while (l <= r) { ll mid = (l + r) >> 1; if (check(mid)) pr = mid, l = mid + 1; else { if (mid <= (1 + n) / 2) l = mid + 1; else r = mid - 1; } } l = 2, r = pr; while (l <= r) { ll mid = (l + r) >> 1; if (check(mid)) pl = mid, r = mid - 1; else l = mid + 1; } while (check(pr + 1)) pr++; while (check(pl - 1)) pl--; printf ("%lld\n", max(C(pl) + C(n - pl), C(pr) + C(n - pr))); }
constint inf = 0x3f3f3f3f; constint maxn = 2e5 + 5; int n, len, val[maxn], f[21][1 << 20]; char s[21];
inlineintpre(int S, int i) { return S >> (len - i); }
inlineintsuf(int S, int i) { return S & ((1 << i) - 1); }
inlineintdeal(int S, int T) { for (int i = len; i; --i) if (suf(S, i) == pre(T, i)) return i; return0; }
inlineintread() { intx(0); charo(getchar()); while (o < '0' || o > '9') o = getchar(); for (; o >= '0' && o <= '9'; o = getchar()) x = (x << 1) + (x << 3) + (o ^ 48); return x; }
intmain() { freopen ("puzzle.in", "r", stdin); freopen ("puzzle.out", "w", stdout); n = read(); for (int i = 1; i <= n; ++i) { scanf ("%s", s); len = strlen(s); for (intj(0); j < len; ++j) val[i] = (val[i] << 1) + (s[j] ^ 48); }
intres(0); memset (f, 0x3f, sizeof f); f[0][0] = len; for (int i = 2; i <= n; ++i) { int l = len - deal(val[i - 1], val[i]); res += l; int mn = inf; for (int j = 0; j <= len; ++j) mn = min(mn, f[j][pre(val[i], j)] + len - j - l); for (int j = 0; j <= len; ++j) f[j][suf(val[i - 1], j)] = min(f[j][suf(val[i - 1], j)], mn); } printf ("%d\n", f[0][0] + res); }