#include <iostream>
#include <vector>
#include <map>
#include <cmath>
#define MOD 1000000007

using namespace std;

#ifdef DEBUG
#define PRINT_VALUE(v){cout<<#v<<" :"<<v<<endl;}
#define PRINT_ARRAY(arr,size){cout<<#arr<<" [";for(int i=1;i<=size;i++){cout<<arr[i]<<(i!=size?",":"]\n");}}
#endif

#ifndef DEBUG
#define PRINT_VALUE(v)
#define PRINT_ARRAY(arr,size)
#endif

typedef long long ll;

ll power(ll a, ll b, ll mod) {
    ll res = 1;
    while (b > 0) {
        if (b % 2 == 1)
            res = (res * a) % mod;
        a = (a * a) % mod;
        b /= 2;
    }
    return res;
}

map<ll, ll> prime_factorization(ll x) {
    map<ll, ll> factors;
    for (ll i = 2; i * i <= x; ++i) {
        while (x % i == 0) {
            factors[i]++;
            x /= i;
        }
    }
    if (x > 1) {
        factors[x]++;
    }
    return factors;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int q;
    cin >> q;
    vector<pair<ll, ll>> queries(q);

    for (int i = 0; i < q; ++i) {
        cin >> queries[i].first >> queries[i].second;
    }

    const int MAXN = 1e6 + 5;
    vector<ll> fact(2 * MAXN), invFact(2 * MAXN);

    fact[0] = 1;
    for (int i = 1; i < 2 * MAXN; ++i) {
        fact[i] = fact[i - 1] * i % MOD;
    }
    invFact[2 * MAXN - 1] = power(fact[2 * MAXN - 1], MOD - 2, MOD);
    for (int i = 2 * MAXN - 2; i >= 0; --i) {
        invFact[i] = invFact[i + 1] * (i + 1) % MOD;
    }

    auto binomial = [&](ll n, ll k) {
        if (n < k) return 0LL;
        return fact[n] * invFact[k] % MOD * invFact[n - k] % MOD;
    };

    for (auto [x, n] : queries) {
        if (n == 1) {
            cout << (x == 1 ? 1 : 2) << '\n';
            continue;
        }
        
        map<ll, ll> factors = prime_factorization(x);
        ll result = 1;
        
        for (auto [p, e] : factors) {
            result = result * binomial(2 * n + e - 1, e) % MOD;
        }
        
        cout << result << '\n';
    }

    return 0;
}