#include <bits/stdc++.h>
using namespace std;

#pragma region Macros
using ll = long long;
using pii = pair<int, int>;
using tiii = tuple<int, int, int>;
template<class T = ll> using V = vector<T>;
template<class T = ll> using VV = V<V<T>>;
#define int ll
#define IOS\
    ios::sync_with_stdio(false);\
    cin.tie(0);\
    cout.tie(0);
#define FOR(i,l,r) for(ll i=(l);i<(r);++i)
#define REP(i,n) FOR(i,0,n)
#define REPS(i,n) FOR(i,1,n+1)
#define RFOR(i,l,r) for(ll i=(l);i>=(r);--i)
#define RREP(i,n) RFOR(i,n-1,0)
#define RREPS(i,n) RFOR(i,n,1)
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(),(x).end()
#define SORT(name) sort(name.begin(), name.end())
#define RSORT(name)\
    SORT(name);\
    reverse(all(name));
#define ZERO(p) memset(p, 0, sizeof(p))
#define MINUS(p) memset(p, -1, sizeof(p))
#if 1
#  define DBG(fmt, ...) printf(fmt, ##__VA_ARGS__)
#else
#  define DBG(fmt, ...)
#endif
inline void Yes(bool b = true) {printf("%s\n", (b ? "Yes" : "No"));}
inline void YES(bool b = true) {printf("%s\n", (b ? "YES" : "NO"));}
template <class T> inline void print(T x){ cout << x << '\n';}
template<typename T1,typename T2> inline void chmin(T1 &a, T2 b){ if(a > b) a = b; }
template<typename T1,typename T2> inline void chmax(T1 &a, T2 b){ if(a < b) a = b; }


const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const double DINF = std::numeric_limits<double>::infinity();
const int MOD = 1000000007;
#pragma endregion

template< typename T >
class CumulativeSum
{
public:
    CumulativeSum() {}
    CumulativeSum(int sz) : m_Data(sz, T(0)) {};

    void Init(int sz) { m_Data.assign(sz, T(0)); }

    // k に x を加える O(1)
    void Add(int k, T x) {
        assert(static_cast<int>(m_Data.size()) >= k);
        if(static_cast<int>(m_Data.size()) <= k) { m_Data.push_back(x); }
        else { m_Data[k] = (m_Data[k] + x); }
    }

    // 累積和の構築 O(m_Data.size())
    void Build() {
        for(int i = 1; i < static_cast<int>(m_Data.size()); i++) {
            m_Data[i] = (m_Data[i] + m_Data[i - 1]);
        }
    }

    // 区間 [0, k] の和を返す O(1)
    // 閉区間なので k が含まれることに注意
    T Query(int k) {
        if(k < 0) { return T(0); }
        return (m_Data[min(k, static_cast<int>(m_Data.size()) - 1)]);
    }

    // 区間 [l, h] の和を返す O(1)
    // 閉区間なので k が含まれることに注意
    T Query(int l, int h) {
        return (this->Query(h) - this->Query(l-1));
    }
private:
    vector< T > m_Data;
};

static inline ll bin_search2(const vector<ll>& v, ll lb, ll ub, ll val) {
    lb--; ub--;
    while(ub - lb > 1) {
        ll mid = (lb + ub) / 2;
        if(v[mid] >= val) { ub = mid; }
        else { lb = mid; }
    }
    // この時点で lb + 1 = ub
    return (v[ub] >= val) ? ub : -1;
}

const int MAX_N = 100010;

int N, M;
V<> A;
CumulativeSum<int> cs;

// １ 回で得られる幸福度を最低 x 以上とした場合に
// M 回以上握手できるなら true
bool check(int x) {
    int cnt = 0;
    RREP(i, N) {
        int val = x - A[i];
        int ind = bin_search2(A, 0, A.size(), val);
        //DBG("  x: %lld val: %lld ind: %lld\n", x, val, ind);
        if(ind < 0) { continue; }
        int cnt_tmp = N - ind;   // 今回のペア数
        cnt += cnt_tmp;
        if(cnt >= M) { return true; }
    }
    return false;
}

int solve() {
    // ペアにしたときに x 以上の幸福度になる組み合わせだけで M 回いけるか？
    // その時の最大の x を求める
    int lb = 0, ub = 1000000;
    while(ub - lb > 1) {
        int mid = (lb + ub) / 2;
        //DBG("lb: %lld ub: %lld mid: %lld\n", lb, ub, mid);
        if(check(mid)) { lb = mid; }
        else { ub = mid; }
    }
    int x = lb;
    if(check(ub)) { x = ub; }

    //DBG("x: %lld\n", x);

    // その値に従って取った時の合計を求める
    int cnt = M;
    int ret = 0;
    // まず x + 1 を取る
    x++;
    RREP(i, N) {
        int val = x - A[i];
        int ind = bin_search2(A, 0, A.size(), val);
        if(ind < 0) { continue; }
        int cnt_tmp = N - ind;   // 今回のペア数
        ret += cs.Query(ind, N - 1) + A[i] * cnt_tmp;
        cnt -= cnt_tmp;
    }
    assert(cnt > 0);
    // 次に x を取る。
    // cnt が M より大きくならないよう調整する
    x--;
    ret += x * cnt;

    return ret;
}

signed main() {
    IOS;
    cin >> N >> M;
    A.resize(N);
    REP(i, N) {
        cin >> A[i];
    }
    SORT(A);

    cs.Init(N);
    REP(i, N) { cs.Add(i, A[i]); }
    cs.Build();

    int ans = solve();
    print(ans);

    return 0;
}


Measured memory_bytes: 4720