思路:根据唯一分解定理,这y个整数全部分解质因数后混在一起,就是x的组成质因数,所以对x的每种质因子独立考虑,x拆成p1^a1*p2^a2...每个素数相当于将ai个球放到y个桶允许有空桶的模型,乘起来就是了。至于符号肯定是偶数个,再乘个pow(2, y-1)就ok。
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
typedef long long LL;
const LL mod = 1e9+7;
const int maxn = 1e6+30;
LL inv[maxn+3] = {1,1}, fac[maxn+3] = {1,1}, fi[maxn+3] = {1,1};
int f2[maxn+3]={1,2},lowp[maxn+3];
void init()
{
memset(lowp, -1, sizeof(lowp));
for(int i=2; i<=maxn; ++i)
{
if(lowp[i] == -1)
for(int j=i; j<=maxn; j+=i) if(lowp[j] == -1) lowp[j]=i;
f2[i] = f2[i-1]*2%mod;
fac[i] = fac[i-1]*i%mod;
inv[i] = (mod-mod/i)*inv[mod%i]%mod;
fi[i] = fi[i-1]*inv[i]%mod;
}
}
inline LL C(LL n, LL m)//计算组合数
{
if(n<m) return 0;
return fac[n]*fi[m]%mod*fi[n-m]%mod;
}
int main()
{
init();
int t, x, y;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&x,&y);
LL ans = f2[y-1];
while(x != 1)
{
int p = lowp[x], cnt=0;
while(lowp[x] == p)
{
x /= p;
++cnt;
}
ans = ans*C(y+cnt-1,cnt)%mod;
}
printf("%I64d\n",ans);
}
return 0;
}