#include <bits/stdc++.h>
using namespace ::std;
const long long maxn = 5e4 + 50;
const long long logg = 32;
const long long mod = 1e9 + 7;
const long long inf = 1e9 + 500;
int r[maxn * logg][2];
int siz[maxn * logg];
long long po = 2;
int zir[maxn * logg][logg];
long long a[maxn];
long long n;
void add(long long a) {
  long long p = 1;
  for (long long i = logg - 1; i >= 0; i--) {
    bool bit = ((a >> i) & 1);
    if (r[p][bit] == 0) {
      r[p][bit] = po;
      po++;
    }
    p = r[p][bit];
    siz[p]++;
    for (long long i = 0; i < logg; i++) {
      zir[p][i] += ((a >> i) & 1);
    }
  }
}
long long findd(long long a, long long k) {
  long long p = 1;
  long long ans = 0;
  for (long long i = logg - 1; i >= 0; i--) {
    bool bita = ((a >> i) & 1);
    bool bitk = ((k >> i) & 1);
    if (bitk) {
      p = r[p][!bita];
    } else {
      ans += siz[r[p][!bita]];
      p = r[p][bita];
    }
  }
  return ans;
}
long long findds(long long a, long long k) {
  k--;
  long long p = 1;
  long long ans = 0;
  for (long long i = logg - 1; i >= 0; i--) {
    bool bita = ((a >> i) & 1);
    bool bitk = ((k >> i) & 1);
    if (bitk) {
      p = r[p][!bita];
    } else {
      long long v = r[p][!bita];
      for (long long j = 0; j < logg; j++) {
        if ((a >> j) & 1) {
          ans += ((1LL << j) * 1LL * (siz[v] - zir[v][j])) % mod;
          ans %= mod;
        } else {
          ans += ((1LL << j) * (1LL * zir[v][j])) % mod;
          ans %= mod;
        }
      }
      p = r[p][bita];
    }
  }
  return ans;
}
long long good(long long m) {
  m--;
  long long ans = 0;
  for (long long i = 0; i < n; i++) {
    ans += findd(a[i], m);
  }
  return ans / 2;
}
long long poww(long long a, long long b) {
  if (b == 0) {
    return 1;
  }
  long long v = poww(a, b / 2);
  v = (v * v) % mod;
  if (b & 1) {
    v = (v * a) % mod;
  }
  return v;
}
int main() {
  long long m;
  cin >> n >> m;
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  for (long long i = 0; i < n; i++) {
    add(a[i]);
  }
  long long b = 0;
  long long e = 2e9;
  while (e - b > 1) {
    long long mm = (e + b) / 2;
    if (good(mm) >= m) {
      b = mm;
    } else {
      e = mm;
    }
  }
  long long ans = 0;
  for (long long i = 0; i < n; i++) {
    ans += findds(a[i], b);
    ans %= mod;
  }
  long long v = good(b);
  ans -= ((v - m) * b * 2) % mod;
  ans += mod;
  ans %= mod;
  ans *= poww(2, mod - 2);
  ans %= mod;
  cout << ans;
}
