感到非常莫名其妙......
#include<cstdio>
#include<cmath>
#include<bitset>
#include<ctime>
using namespace std;
typedef long long ll;
const int mod = 1e9+7, N = 1e5+20;
inline bool isd(int c){return '0'<=c&&c<='9';}
int read(){
int num,c,f=1;
for(;!isd(c=getchar());f=c);
for(num=c^48;isd(c=getchar());(num*=10)+=c^48);
return f^45?num:-num;
}
ll ksm(ll a,ll p){
ll sum=1;
while(p){
if(p&1) sum=sum*a%mod;
a=a*a%mod;
p>>=1;
}
return sum;
}
int n=N-10;
ll x,y;
ll jc[N], inv[N], prime[N],cnt,ans;
bitset<N> vis;
void init(){
jc[0] = inv[0] = 1;
for(int i=1;i<=n;i++) jc[i] = 1ll*jc[i-1]*i%mod;
inv[n] = ksm(jc[n],mod-2);
for(int i=n-1;i;i--) inv[i] = 1ll*inv[i+1]*(i+1)%mod;
for(int i=2;i<=n;i++){
if(!vis[i]) prime[++cnt] = i;
for(int j=1;j<=cnt&&1ll*i*prime[j]<=n;j++){
vis[i*prime[j]] = 1;
if(!(i/prime[j])) break;
}
}
}
inline ll C(ll a,ll b){
return (jc[a]*inv[b]%mod)*inv[a-b]%mod;
}
ll workcnt(ll a,ll p){
ll sum=0;
while(p%a==0) p/=a,sum++;
return sum;
}
int T;
//void solve(){
// x=read(),y=read(),ans=1;
// for(int i=1;i<=cnt;i++){
// if(prime[i]>x) break;
// if(!(x%prime[i])) ans = (ans*C(workcnt(prime[i],x)+y-1,y-1))%mod;
// }
//// printf("%lld\n",(ans*ksm(2,y-1))%mod);
//// printf("T:%d\n",T);
//}
int main(){
// freopen("data.in","r",stdin);
// freopen("std.txt","w",stdout);
//printf("%lld\n",ksm(2,0));
// double time1 = clock();
init();
T=read();
while(T--){
x=read(),y=read(),ans=1;
for(int i=1;i<=cnt;i++){
if(prime[i]>x) break;
if(!(x%prime[i])) ans = (ans*C(workcnt(prime[i],x)+y-1,y-1))%mod;
}
printf("%lld\n",(ans*ksm(2,y-1))%mod);
// printf("T: %d\n",T);
}
// printf("%.3f\n",(clock()-time1)/1000);
return 0;
}