这里主要写写独立性的感性理解证明,方便理解:
让我们来看一个例子(当x=216,y=2时)
216分解后为:2*2*2*3*3*3
独立性证明:
2 | 2 2
3 3 3 |
3 3 | 3
| 3 3 3
3 | 3 3
如上所示为一个2的方案 可以与3的所有独立方案都形成新的组合依次类推
原因是因为2和3是不同的数字且互质,所以不会出现重复的情况
综上故满足独立性
AC代码:
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define x first
#define y second
#define de(a) #a << " = " << (a)
#define all(x) x.begin(), x.end()
using namespace std;
typedef pair<int,int> PII;
constexpr int N=2e5+10,mod=1e9+7,inf=0x3f3f3f3f3f3f3f3f;
constexpr double eps=1e-8,pi=acos(-1.0);
int qmi(int a,int b)
{
int ans=1;
while(b)
{
if(b&1)ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int c(int a,int b)
{
if(b>a)return 0;
int sum=1;
for(;b>=1;b--,a--)
{
sum=sum*a%mod;
sum=sum*qmi(b,mod-2)%mod;
}
return sum;
}
int lucas(int a,int b)
{
if(b==0)return 1;
return lucas(a/mod,b/mod)*c(a%mod,b%mod)%mod;
}
void solve(int T)
{
int x,y,sum=0;
cin>>x>>y;
map<int,int>h;
auto qfn=[&](int x,map<int,int>&t){
for(int i=2;i<=x/i;i++)while(x%i==0)x/=i,t[i]++;
if(x>1)t[x]++;
};
qfn(x,h);
int ans=1;
for(auto i:h)ans=ans*lucas(y+i.y-1,i.y)%mod;
cout<<ans<<endl;
}
signed main()
{
bool multitest=1;
//cout<<setiosflags(ios::fixed),cout.precision(2);
ios::sync_with_stdio(false),cin.tie(nullptr);
int _t=1;
if(multitest)cin>>_t;
for(int i=1;i<=_t;i++)
{
solve(i);
}
return 0;
}