#include <bits/stdc++.h>
using namespace std;
template <typename T>
void rd(T& x) {
  long long f = 0, c;
  while (!isdigit(c = getchar())) f ^= !(c ^ 45);
  x = (c & 15);
  while (isdigit(c = getchar())) x = x * 10 + (c & 15);
  if (f) x = -x;
}
template <typename T>
void pt(T x, long long c = -1) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) pt(x / 10);
  putchar(x % 10 + 48);
  if (c != -1) putchar(c);
}
const long long N = 1000005, P = 1e9 + 7;
long long T;
long long n, p, a[N];
long long fpow(long long k1, long long k2) {
  long long k3 = 1;
  for (; k2; k2 >>= 1, k1 = 1LL * k1 * k1 % P)
    if (k2 & 1) k3 = 1LL * k3 * k1 % P;
  return k3;
}
signed main() {
  rd(T);
  while (T--) {
    rd(n), rd(p);
    for (long long i = (1); i <= (n); ++i) rd(a[i]);
    if (p == 1) {
      pt(n & 1, '\n');
      continue;
    }
    sort(a + 1, a + 1 + n, [&](long long x, long long y) { return x > y; });
    long long k1 = 0;
    long long ans = 0;
    bool gg = 0;
    for (long long i = (1); i <= (n); ++i) {
      if (i > 1 && !gg) {
        if (k1 != 0)
          for (long long j = (a[i - 1]); j >= (a[i] + 1); --j) {
            if (k1 > 1e18 / p) {
              gg = 1;
              break;
            }
            k1 *= p;
          }
      }
      if (k1 || gg) {
        --k1;
        (ans -= fpow(p, a[i])) %= P;
      } else {
        ++k1;
        (ans += fpow(p, a[i]));
      }
    }
    pt((ans + P) % P, '\n');
  }
  return 0;
}
