import java.math.*

fun main(args: Array<String>) {
    val (N, M) = readInputLine().split(" ").map { it.toLong() }
    val AArr = readInputLine().split(" ").map { it.toLong() }.sortedDescending().toLongArray()
    val Amax = AArr[0]

    // パワーがi以上の人数
    // カウント人数配列のインデックスA_kの値を加算後、上から累積和を取ることで求められる
    val powCnt = LongArray(Amax.toInt() * 2 + 1)

    for (A in AArr) {
        powCnt[A.toInt()]++
    }

    for (i in Amax.toInt() - 1 downTo 0) {
        powCnt[i] += powCnt[i + 1]
    }

    // M以上の回数増やせる幸福度X最大値の二分探索
    // 左手のパワーを固定すれば、先に求めた配列からO(1)で求められ、左手がN人いるため1回あたりO(N)で求められる
    var l = 0L
    var r = Amax * 2L + 1L

    while (r - l > 1L) {
        val m = (l + r) / 2L
        val cnt = AArr.fold(0L) { acc, A -> acc + powCnt[Math.max(0L, m - A).toInt()] }
        if (cnt >= M) {
            l = m
        } else {
            r = m
        }
    }

    // 答えを求める
    // 幸福度Xを増やせるパターンがMより多い可能性があるため、X + 1増やせるパターンの個数を求め、M - その個数分だけ最後に足すことにする
    var already = 0L
    var ans = 0L

    // Aの降順累積和
    // 幸福度X + 1での総和を求める際、先のpowCntをインデックスとすれば各左手について総和が求められる
    // ただし、カウントは0を取る場合があるため、1から使用することにする
    val sumArr = LongArray(N.toInt() + 1)
    for (i in 0 until N.toInt()) {
        sumArr[i + 1] = sumArr[i] + AArr[i]
    }

    for (A in AArr) {
        val cnt = powCnt[Math.max(0L, r - A).toInt()]
        ans += A * cnt + sumArr[cnt.toInt()]
        already += cnt
    }

    ans += l * (M - already)

    println(ans)
}

fun readInputLine(): String {
    return readLine()!!
}
