#include <bits/stdc++.h>
using namespace std;
const int N = 1e9 + 7;
const int Y = 2e6 + 1;
const int Q = 1e5 + 1;
int q;
long long int res[Q];
long long int fact[Y + 1];
long long int mypow(long long int x, long long int y) {
  if (y == 0)
    return 1;
  else {
    long long int z = mypow(x, y / 2);
    if (y % 2 == 0) {
      return (z * z) % N;
    } else {
      return ((z * z) % N * x) % N;
    }
  }
}
void pre() {
  fact[0] = 1;
  for (long long int i = 1; i <= Y; i++) {
    fact[i] = (fact[i - 1] * i) % N;
  }
}
int main() {
  pre();
  cin >> q;
  for (int i = 0; i < q; i++) {
    long long int x, y;
    cin >> x >> y;
    vector<long long int> amel;
    long long int z = x;
    for (long long int j = 2; j <= sqrt(z); j++) {
      if (x % j == 0) {
        long long int tedad = 0;
        while (x % j == 0) {
          tedad++;
          x /= j;
        }
        amel.push_back(tedad);
      }
    }
    if (amel.size() > 0) {
      for (long long int j = sqrt(z); j >= 2; j--) {
        if (z % j == 0 and x % (z / j) == 0) {
          long long int tedad = 0;
          long long int tmp = z / j;
          while (x % tmp == 0) {
            tedad++;
            x /= tmp;
          }
          amel.push_back(tedad);
        }
      }
    } else if (z > 1) {
      amel.push_back(1);
    }
    long long int test = 1;
    for (int j = 0; j < amel.size(); j++) {
      long long int r1 =
          (fact[y + amel[j] - 1] * mypow(fact[y - 1], N - 2)) % N;
      long long int r2 = (r1 * (mypow(fact[amel[j]], N - 2))) % N;
      test = (test * r2) % N;
    }
    res[i] = (test * mypow(2, y - 1)) % N;
  }
  for (int i = 0; i < q; i++) {
    cout << res[i] << endl;
  }
}
