这个还是比较简单的.
将 $x$ 质因数分解,然后依次考虑每个质因子的贡献就行了,贡献是一个组合.
code:
#include <cstdio>
#include <algorithm>
#define N 2000006
#define ll long long
#define mod 1000000007
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int tot;
int vis[N],prime[N],inv[N],fac[N],low[N];
int qpow(int x,int y)
{
int tmp=1;
for(;y;y>>=1,x=1ll*x*x%mod)
if(y&1) tmp=1ll*tmp*x%mod;
return tmp;
}
void init()
{
for(int i=2;i<N;++i)
{
if(!vis[i]) prime[++tot]=i,low[i]=i;
for(int j=1;j<=tot&&prime[j]*i<N;++j)
{
vis[i*prime[j]]=1,low[i*prime[j]]=prime[j];
if(i%prime[j]==0) break;
}
}
}
int C(int x,int y) { if(x<y) return 0; return 1ll*fac[x]*inv[y]%mod*inv[x-y]%mod; }
int main()
{
// setIO("input");
int i,j,q;
scanf("%d",&q);
init();
inv[0]=fac[0]=1;
for(i=1;i<N;++i) fac[i]=1ll*fac[i-1]*i%mod, inv[i]=qpow(fac[i],mod-2);
for(i=1;i<=q;++i)
{
int x,y,ans=1;
scanf("%d%d",&x,&y);
while(x!=1)
{
int p=low[x],cnt=0;
while(low[x]==p) x/=p,++cnt;
ans=1ll*ans*C(y+cnt-1,cnt)%mod;
}
ans=1ll*ans*qpow(2,y-1)%mod;
printf("%d\n",ans);
}
return 0;
}