#include <iostream>
#include <vector>
#include <algorithm>
#include <limits.h>
#define int long long
#define all(box) box.begin(), box.end()
using namespace std;
using P = pair<int,int>;
using ll = long long;
const long long INF = LLONG_MAX/3;

template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
inline void Yes (bool condition) { if(condition) { cout << "Yes" << endl; } else { cout << "No" << endl;} }

struct UnionFind{
	std::vector<int> par,siz;
	void init(int n){
		par.resize(n);
		for(int i=0;i<n;i++)par[i]=i;
		siz.resize(n,1);
	}
	UnionFind(int n){
		init(n);
	}
	int root(int n){
		if(par[n]==n)return n;
		else return par[n]=root(par[n]);
	}
	bool issame(int x,int y){
		return (root(x)==root(y));
	}
	bool marge(int a,int b){
		if(issame(a,b))return false;
		else{
			a=root(a),b=root(b);
			if(siz[a]<siz[b])swap(a,b);
			siz[b]+=siz[a];
			par[a]=par[b];
			return true;
		}
	}
	int size(int n){
		return siz[root(n)];
	}
};

long long gcd(long long a,long long b){
    if(b==0)return a;
    return gcd(b,a%b);
}
long long lcm(long long i,long long j){
    return i*(j/gcd(i,j));
}

const int MOD=1e9+7;
long long fac[510000], finv[510000], inv[510000];
long long MAX=510000;
bool COMinited=false;
long long COM(int n, int k){
	if(COMinited==false){
		fac[0] = fac[1] = 1;
    	finv[0] = finv[1] = 1;
    	inv[1] = 1;
    	for (int i = 2; i < MAX; i++){
        	fac[i] = fac[i - 1] * i % MOD;
        	inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        	finv[i] = finv[i - 1] * inv[i] % MOD;
    	}
		COMinited=true;
	}
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}
long long modpow(long long a, long long n, long long mod) {
    long long res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}
long long modinv(long long a, long long mod) {
    return modpow(a, mod - 2, mod);
}
template< typename T >
struct BinaryIndexedTree {
  vector< T > data;
  BinaryIndexedTree(int sz) {
    data.assign(++sz, 0);
  }

  T sum(int k) {
    T ret = 0;
    for(++k; k > 0; k -= k & -k) ret += data[k];
    return (ret);
  }

  void add(int k, T x) {
    for(++k; k < data.size(); k += k & -k) data[k] += x;
  }
};
int n,m;
vector<int> c(100010,0);
vector<int> a(100010);
int search(){
	int l=0,r=200010;
	while(abs(l-r)>1){
		int mid=(l+r)/2;
		int cnt=0;
		for(int i=0;i<n;i++){
			if(mid-a[i]>=0&&mid-a[i]<100010){
				cnt+=c[mid-a[i]];
			}else if(mid-a[i]<100010){
				cnt+=n;
			}
		}
		if(cnt<m)r=mid;
		else l=mid;
	}
	return l;
}
signed main(){
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>a[i];
	for(int i=0;i<n;i++){
		c[a[i]]++;
	}
	sort(a.begin(),a.begin()+n);
	for(int i=100008;i>=0;i--){
		c[i]=c[i+1]+c[i];
	}
	int l=search();
	vector<int> s(100010,0);
	s[n-1]=a[n-1];
	for(int i=n-2;i>=0;i--){
		s[i]=a[i]+s[i+1];
	}
	int ret=0,cnt=0;
	for(int i=0;i<n;i++){
		int idx=lower_bound(a.begin(),a.begin()+n,l-a[i])-a.begin();
		ret+=s[idx]+(n-idx)*a[i];
		cnt+=n-idx;
	}
	ret-=l*(cnt-m);
	cout<<ret<<endl;
}

Measured memory_bytes: 2688