题意
思路
今天的题比较简单(bushi)
先不考虑正负号的问题,题意是将 X 拆成若干因数放到不同位置上,我们考虑 X 的每个质因子,即对于一个质因子,可以放到任意一个位置上,即“球相同,盒不同,允许空盒”的模型,假设该质因数有 n 个,则将这 n 个数放入 Y 个位置的方案数为 ;
对于正负号问题,由于 X 为正数,故若存在负号,则负号的数量一定为偶数,即,通过二项式定理可得,值为
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
vector<pair<int,int> > vv;
ll fac[1001010],inv[1001010];
void calc(ll x){
for(int i=2;i*i<=x;i++){
if(x%i) continue;
int cnt=0;
while(x%i==0){
cnt++;
x/=i;
}
vv.push_back({i,cnt});
}
if(x>1) vv.push_back({x,1});
}
ll qpow(ll a,ll b){
ll ans=1;
while(b){
if(b&1) ans=ans*a%MOD;
a=a*a%MOD;
b>>=1;
}
return ans%MOD;
}
ll ni(ll x){
return qpow(x,MOD-2);
}
int main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
fac[0]=1;
for(int i=1;i<=1001000;i++) fac[i]=fac[i-1]*i%MOD;
inv[1001000]=ni(fac[1001000]);
for(int i=1001000;i>=1;i--) inv[i-1]=inv[i]*i%MOD;
int _;
cin>>_;
while(_--){
vv.clear();
ll x,y;
cin>>x>>y;
calc(x);
ll ans=1;
for(auto e:vv) ans=ans*(fac[y+e.second-1]*inv[y-1]%MOD*inv[e.second]%MOD)%MOD;
ans=ans*qpow(2,y-1)%MOD;
cout<<ans<<"\n";
}
return 0;
}