using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string[] args)
        {
            //問題クラスを展開
            ProgramE a = new ProgramE();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        static void main()
        {
            //日付を入力する
            string input = Console.ReadLine();
            int n = input[0];//文字をint型で代入する

            n++;//int型で1足すことでアルファベットが1進む。

            //char型にして答を出す
            Console.WriteLine((char)(n));

        }
    }

    class ProgramB
    {
        static void main()
        {

            //入力
            string[] input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int k = int.Parse(input[1]);
            int m = int.Parse(input[2]);
            string[] input_a = Console.ReadLine().Split(' ');
            int[] a = new int[n - 1];
            int sum = 0;


            //今までの点をすべて足す
            for (int i = 0; i < n - 1; i++)
            {
                a[i] = int.Parse(input_a[i]);
                sum += a[i];
            }


            //必要な点数と今までのままでの点数の差から判断する
            if (m * n - sum > k)//最後に取れる点より必要な点がおおきいときはあり得ない
            {
                Console.WriteLine("-1");
            }
            else if (m * n - sum <= 0)//最後に点を取らなくていいのはすでに必要な点数とれているとき
            {
                Console.WriteLine("0");
            }
            else//それ以外は必要な点数を出す
            {
                Console.WriteLine(m * n - sum);
            }

        }
    }

    class ProgramC
    {
        static void main()
        {

            //入力
            string[] input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);
            int[] right = new int[n];
            int[] wrong = new int[n];


            //それぞれを判定する
            for (int i = 0; i < m; i++)
            {
                string[] temp = Console.ReadLine().Split(' ');
                int p = int.Parse(temp[0]);
                string s = temp[1];


                //すでにACしているなら無視する
                if (right[p - 1] == 1)
                    continue;

                if (s == "WA")
                {
                    wrong[p - 1]++;//間違い数をカウント
                }
                else
                {
                    right[p - 1] = 1;//ACしたら1にする。
                }
            }

            int ans1 = 0;
            int ans2 = 0;
            for (int i = 0; i < n; i++)
            {
                //正しい答えの数を足す
                ans1 += right[i];
                //もしその問題が答えならWAの数を計上する
                if (right[i] == 1)
                    ans2 += wrong[i];

            }

            //答えを出力
            Console.WriteLine(ans1 + " " + ans2);

        }
    }

    class ProgramD
    {
        static void main()
        {

            //入力
            string[] input = Console.ReadLine().Split(' ');
            int H = int.Parse(input[0]);
            int W = int.Parse(input[1]);
            int INF = 1000000;


            //ワーシャルフロイド法の準備。すべてとりあえず#とする。（そうするとこのあと.だけの判定で済む）
            int[,] dis = new int[H * W + 1, H * W + 1];
            for (int i = 0; i < H * W; i++)
                for (int j = 0; j < H * W; j++)
                {
                    if (i == j)
                        dis[i, j] = 0;
                    else
                        dis[i, j] = INF;
                }


            //前の迷路状態を記録して置くためにmaze2を作成。
            string maze2 = "####################";

            for (int i = 0; i < H; i++)
            {
                //迷路を読み込む
                string maze = Console.ReadLine();

                for (int j = 0; j < W; j++)
                {
                    //横のつながりを判定する。つながっていれば1を代入
                    if (j > 0 && maze[j - 1] == '.' && maze[j] == '.')
                    {
                        dis[i * W + j, i * W + j - 1] = 1;
                        dis[i * W + j - 1, i * W + j] = 1;
                    }

                    //縦のつながりを判定する。ひとつ上と判定します。
                    if (i > 0 && maze2[j] == '.' && maze[j] == '.')
                    {
                        dis[i * W + j, (i - 1) * W + j] = 1;
                        dis[(i - 1) * W + j, i * W + j] = 1;
                    }


                }

                //メイズを記録する
                maze2 = maze;

            }


            //ワーシャルフロイド法を用いる
            for (int k = 0; k < H * W; k++)       // 経由する頂点
                for (int i = 0; i < H * W; i++)     // 始点
                    for (int j = 0; j < H * W; j++)   // 終点
                        dis[i, j] = Math.Min(dis[i, j], dis[i, k] + dis[k, j]);

            int ans = 0;


            //最大の経路を算出する
            for (int i = 0; i < H * W; i++)
                for (int j = 0; j < H * W; j++)
                {
                    if (dis[i, j] <= INF)
                    {
                        int temp = dis[i, j];
                        if (ans < temp)
                            ans = temp;

                    }
                }

            //答を出す
            Console.WriteLine(ans);

        }

    }

    class ProgramE
    {
        public void main()
        {
            string[] s = Console.ReadLine().Split(' ');
            long n = long.Parse(s[0]);
            long k = long.Parse(s[1]);

            string[] ss = Console.ReadLine().Split(' ');
            long[] a = new long[n];

            for (int i = 0; i < n; i++)
                a[i] = long.Parse(ss[i]);

            Array.Sort(a);


            long MOD = 1000000000 + 7;
            long sum = 0;

            //下準備
            nCk com = new nCk();
            com.fac = new long[n + 1];
            com.inv = new long[n + 1];
            com.finv = new long[n + 1];
            com.mod = MOD;
            com.max = n + 1;

            //メモ作成
            com.com_init();

            //max:n-i-1Ck-1、min:i-1Ck-1なのでそれぞれ求めて引く
            for (long i = 0; i < n; i++)
            {
                sum += a[i] *(com.com(i, k - 1) - com.com(n - i - 1, k - 1)) % MOD;
                sum %= MOD;
            }

            //出力
            Console.WriteLine(sum);
        }
    }

    class nCk
    {
        public long mod;
        public long max;
        public long[] fac;
        public long[] inv;
        public long[] finv;


        //メモ作成(前準備)
        public void com_init()
        {
            fac[0] = 1;
            fac[1] = 1;
            finv[0] = 1;
            finv[1] = 1;
            inv[1] = 1;
            for (long i = 2; i < max; i++)
            {
                fac[i] = i * fac[i - 1] % mod;
                inv[i] = mod - inv[mod % i] * (mod / i) % mod;
                finv[i] = finv[i - 1] * inv[i] % mod;
            }
        }

        //二項計算
        public long com(long n, long k)
        {
            if (n < 0 || k < 0)
                return 0;
            if (n < k)
                return 0;
            return fac[n] * (finv[n - k] * finv[k] % mod) % mod;
        }

    }

}




    

Measured memory_bytes: 31580