#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200000 + 1000;
const long long INF = 0x1f1f1f1f1f1f1f1fll;
struct Node {
  int l, r;
  pair<long long, long long> s;
  long long p;
  Node *lc, *rc;
  Node(int _l = 0, int _r = 0)
      : l(_l), r(_r), s(INF, 0), p(0), lc(NULL), rc(NULL) {}
} * root;
int n, m, r = 0;
long long g[MAXN], a[MAXN], ans = 0;
pair<long long, long long> merge(const pair<long long, long long> &a,
                                 const pair<long long, long long> &b) {
  if (a.first == b.first)
    return make_pair(a.first, max(a.second, b.second));
  else if (a.first < b.first)
    return a;
  else
    return b;
}
void add(Node *now, long long v) {
  now->p += v;
  now->s.first += v;
}
void down(Node *now) {
  if (now->p) {
    add(now->lc, now->p);
    add(now->rc, now->p);
    now->p = 0;
  }
}
void update(Node *now) { now->s = merge(now->lc->s, now->rc->s); }
void build(Node *&now, int l, int r) {
  now = new Node(l, r);
  if (l == r) return;
  int mid = (l + r) / 2;
  build(now->lc, l, mid);
  build(now->rc, mid + 1, r);
}
void rebuild(Node *now, int l, int r) {
  now->s = make_pair(INF, 0);
  now->p = 0;
  if (l == r) {
    now->s = make_pair(a[l], l);
    return;
  }
  int mid = (l + r) / 2;
  rebuild(now->lc, l, mid);
  rebuild(now->rc, mid + 1, r);
  update(now);
}
void modify(Node *now, int l, int r, long long v) {
  if (now->r < l || r < now->l) return;
  if (l <= now->l && now->r <= r) {
    add(now, v);
    return;
  }
  down(now);
  modify(now->lc, l, r, v);
  modify(now->rc, l, r, v);
  update(now);
}
pair<long long, long long> query(Node *now, int l, int r) {
  if (now->r < l || r < now->l) return make_pair(INF, 0);
  if (l <= now->l && now->r <= r) return now->s;
  down(now);
  return merge(query(now->lc, l, r), query(now->rc, l, r));
}
long long calc(int r) {
  long long ret = 0;
  long long lef = m - n * r;
  for (int i = 1; i <= n; i++) {
    a[i] = g[i] - ((long long)(r - 1) * r * n / 2 + r * i);
    ret += ((long long)(r - 1) * r * n / 2 + r * i);
    if (a[i] < 0) return -1;
  }
  rebuild(root, 1, n);
  while (lef >= 1) {
    pair<long long, long long> res = query(root, 1, n);
    long long p = res.second, v = res.first;
    if (p == n || v >= lef * r) {
      if (v == 0)
        break;
      else if (v >= r) {
        long long times = min(lef, v / r);
        modify(root, 1, n, -(r * times)), ret += r * n * times;
        lef -= times;
      } else {
        modify(root, 1, n, -v), ret += v * n;
        lef -= 1;
      }
    } else {
      if (v == 0) {
        pair<long long, long long> res = query(root, p + 1, n);
        long long p2 = res.second, v2 = res.first;
        long long times = min(lef, v2);
        modify(root, p + 1, n, -(1 * times)), ret += (n - p) * 1 * times;
        lef -= times;
      } else if (v >= r - 1) {
        pair<long long, long long> res = query(root, p + 1, n);
        long long p2 = res.second, v2 = res.first;
        long long times = lef;
        if (r - 1 > 0) times = min(times, v / (r - 1));
        min(times, v2 / r);
        times = min(times, v2 - v);
        times = min(times, lef * r - v);
        modify(root, 1, p, -((r - 1) * times)), ret += p * (r - 1) * times;
        modify(root, p + 1, n, -(r * times)), ret += (n - p) * r * times;
        lef -= times;
      } else {
        modify(root, 1, p, -v), ret += p * v;
        modify(root, p + 1, n, -(v + 1)), ret += (n - p) * (v + 1);
        lef -= 1;
      }
    }
  }
  return ret;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 1; i <= n; i++) cin >> g[i];
  build(root, 1, n);
  for (int i = 1; i * n <= m; i++) {
    long long res = calc(i);
    if (res < 0) break;
    ans = max(ans, res);
  }
  cout << ans << endl;
  return 0;
}
