#include <bits/stdc++.h>
using namespace std;
const long long inf = (long long)1e+9 + 7ll;
const long long linf = (long long)1e+18 + 7ll;
const long double eps = (long double)1e-10;
const long double pi = acosl((long double)-1.0);
const int alph = 26;
static char buff[(int)2e6 + 17];
const int maxn = (int)1e5 + 17;
int n, k;
long long ans;
int a[maxn], cnt[maxn];
bool good[maxn];
vector<int> r[maxn];
bool read() {
  if (scanf("%d %d", &n, &k) != 2) return false;
  for (int i = 0; i < n; ++i) scanf("%d", a + i);
  return true;
}
void solve() {
  for (int i = 0; i <= 30000; ++i)
    if (__builtin_popcount(i) == k) good[i] = true;
  for (int i = 0; i <= 10000; ++i)
    for (int j = 0; j <= 10000; ++j)
      if (good[i ^ j]) r[i].push_back(j);
  int t = 0;
  for (int i = 0; i <= 10000; ++i)
    if (((int)(r[i].size())) > ((int)(r[t].size()))) t = i;
  for (int i = 0; i < n; ++i) {
    for (auto& j : r[a[i]]) ans += cnt[j];
    ++cnt[a[i]];
  }
  printf("%lld\n", ans);
}
void naive() {
  long long res = 0;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < i; ++j)
      if (__builtin_popcount(a[i] ^ a[j]) == k) ++res;
  printf("%lld\n", res);
  if (res != ans) {
    printf("WA ON TEST:\n%d %d\n", n, k);
    for (int i = 0; i < n; ++i) printf("%d ", a[i]);
    printf("\n%d %d\n", ans, res);
    exit(0);
  }
}
void gen() {
  n = 1 + rand() % 1000;
  k = rand() % 15;
  ans = 0;
  for (int i = 0; i < n; ++i) a[i] = rand() % 10000;
  memset(good, false, sizeof(good));
  for (long long i = 0ll; i < (long long)10000; ++i) {
    r[i].clear();
    cnt[i] = 0;
  }
}
int main() {
  srand(time(nullptr));
  if (1) {
    while (read()) solve();
  } else {
    for (;;) {
      gen();
      solve();
      naive();
    }
  }
  return 0;
}
