def nibutan(n, M):

  ok = 0

  ng = M + 1

  while abs(ok - ng) > 1:

    mid = (ok + ng) // 2

    #print("value:", mid)

    if nasu(mid) >= n:

      ok = mid

    else:

      ng = mid

  return ok



def nasu(x):

  ans = 0

  for i in A:

    #print("L:", i, end = " ")

    t = N - hogetan(x - i)

    #print("n:", t)

    ans += t

  return ans



def hogetan(n):

  ok = N

  ng = -1

  while abs(ok - ng) > 1:

    mid = (ok + ng) // 2

    if A[mid] >= n:

      ok = mid

    else:

      ng = mid

  return ok



N, M = list(map(int, input().split()))

A = list(map(int, input().split()))





A.sort()

MAX = A[-1] + A[-1]

inf = MAX + 10



t = nibutan(M, MAX)

mi = inf

cnt = 0

ans = 0

for i in A:

  k = hogetan(t - i)

  n = N - k

  cnt += n

  if n != 0:

    mi = min(mi, i + A[k])

  ans += n * 2 * i



ans -= mi * (cnt - M)



print(ans)
import numpy as np

from numpy.fft import fft

from numpy.fft import ifft

class FFT:

  def exe(s, A, B):

    N, M = 1, len(A) + len(B) - 1

    while N < M: N <<= 1

    A, B = s.arrN(N, A), s.arrN(N, B)

    A = fft(A) * fft(B)

    A = ifft(A).real[:M] + 0.5

    return list(map(int, A))

  def arrN(s, N, L):

    return np.zeros(N) + (L + [0] * (N - len(L)))



N, M = list(map(int, input().split()))

A = list(map(int, input().split()))



MAX = max(A)

L = [0] * (MAX + 1)

for i in A:

  L[i] += 1



f = FFT()

L = f.exe(L, L)



ans = 0

for i in range(len(L) - 1, -1, -1):

  if L[i] < M:

    ans += i * L[i]

    M -= L[i]

  else:

    ans += i * M

    break



print(ans)
def nibutan(n, M):
    ok = 0
    ng = M + 1
    while abs(ok - ng) > 1:
        mid = (ok + ng) // 2
        # print("value:", mid)
        if nasu(mid) >= n:
            ok = mid
        else:
            ng = mid
    return ok


def nasu(x):
    ans = 0
    for i in A:
        # print("L:", i, end = " ")
        t = N - hogetan(x - i)
        # print("n:", t)
        ans += t
    return ans


def hogetan(n):
    ok = N
    ng = -1
    while abs(ok - ng) > 1:
        mid = (ok + ng) // 2
        if A[mid] >= n:
            ok = mid
        else:
            ng = mid
    return ok


N, M = list(map(int, input().split()))
A = list(map(int, input().split()))
A.sort()
MAX = A[-1] + A[-1]
inf = MAX + 10
t = nibutan(M, MAX)
mi = inf
cnt = 0
ans = 0
for i in A:
    k = hogetan(t - i)
    n = N - k
    cnt += n
    if n != 0:
        mi = min(mi, i + A[k])
    ans += n * 2 * i
ans -= mi * (cnt - M)
print(ans)

import numpy as np
from numpy.fft import fft
from numpy.fft import ifft


class FFT:
    def exe(s, A, B):
        N, M = 1, len(A) + len(B) - 1
        while N < M:
            N <<= 1
        A, B = s.arrN(N, A), s.arrN(N, B)
        A = fft(A) * fft(B)
        A = ifft(A).real[:M] + 0.5
        return list(map(int, A))

    def arrN(s, N, L):
        return np.zeros(N) + (L + [0] * (N - len(L)))


N, M = list(map(int, input().split()))
A = list(map(int, input().split()))
MAX = max(A)
L = [0] * (MAX + 1)
for i in A:
    L[i] += 1
f = FFT()
L = f.exe(L, L)
ans = 0
for i in range(len(L) - 1, -1, -1):
    if L[i] < M:
        ans += i * L[i]
        M -= L[i]
    else:
        ans += i * M
        break
print(ans)

-def nibutan(n, M): -    ok = 0 -    ng = M + 1 -    while abs(ok - ng) > 1: -        mid = (ok + ng) // 2 -        # print("value:", mid) -        if nasu(mid) >= n: -            ok = mid -        else: -            ng = mid -    return ok +import numpy as np +from numpy.fft import fft +from numpy.fft import ifft -def nasu(x): -    ans = 0 -    for i in A: -        # print("L:", i, end = " ") -        t = N - hogetan(x - i) -        # print("n:", t) -        ans += t -    return ans +class FFT: +    def exe(s, A, B): +        N, M = 1, len(A) + len(B) - 1 +        while N < M: +            N <<= 1 +        A, B = s.arrN(N, A), s.arrN(N, B) +        A = fft(A) * fft(B) +        A = ifft(A).real[:M] + 0.5 +        return list(map(int, A)) - -def hogetan(n): -    ok = N -    ng = -1 -    while abs(ok - ng) > 1: -        mid = (ok + ng) // 2 -        if A[mid] >= n: -            ok = mid -        else: -            ng = mid -    return ok +    def arrN(s, N, L): +        return np.zeros(N) + (L + [0] * (N - len(L))) -A.sort() -MAX = A[-1] + A[-1] -inf = MAX + 10 -t = nibutan(M, MAX) -mi = inf -cnt = 0 +MAX = max(A) +L = [0] * (MAX + 1) +for i in A: +    L[i] += 1 +f = FFT() +L = f.exe(L, L) -for i in A: -    k = hogetan(t - i) -    n = N - k -    cnt += n -    if n != 0: -        mi = min(mi, i + A[k]) -    ans += n * 2 * i -ans -= mi * (cnt - M) +for i in range(len(L) - 1, -1, -1): +    if L[i] < M: +        ans += i * L[i] +        M -= L[i] +    else: +        ans += i * M +        break