Description
给出(n(nleq500))个([1,10^9])的数,令(m=prod_{i=1}^n a_i)。求有多少个有序排列({a_n}),使得(prod_{i=1}^n a_i=m)。答案(mod 10^9+7);两个有序排列不同当且仅当(exists i,a_i eq b_i)。
Solution
将(m)分解质因数,即(m=prod_{i=1}^t p_i^{k_i})。
将(m)分配到(n)个数上,相当于依次将(k_i)个(p_i)分配到(n)个数上。因为(p_i)均不相同,所以不会出现重复的计算。即:
[ans=prod_{i=1}^t C(n+k_i-1,n-1)$$ 因为$k_i$不超过$nlog_210^9< 15000$,所以可以开数组`C[15000][500]`。
> 时间复杂度$O(?)$,分解质因数复杂度怎么算呀...
##Code
```
//On Number of Decompositions into Multipliers
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
typedef long long lint;
int const N0=1e5+10;
lint const H=1e9+7;
map<int,int>::iterator it;
map<int,int> cnt;
bool isP[N0]; int cntP,P[N0];
lint C[15000][510];
void init()
{
memset(isP,true,sizeof isP);
for(int i=2;i<=1e5;i++)
{
if(isP[i]) P[++cntP]=i;
for(int j=1;j<=cntP;j++)
{
if(i*P[j]>1e5) break;
isP[i*P[j]]=false;
if(i%P[j]==0) break;
}
}
for(int i=0;i<15e3;i++) C[i][0]=1;
for(int i=1;i<15e3;i++)
for(int j=1;j<=i&&j<=500;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%H;
}
int n;
int main()
{
init();
scanf("%d",&n);
for(int owo=1;owo<=n;owo++)
{
int x; scanf("%d",&x);
for(int i=1;i<=cntP;i++)
while(x%P[i]==0) cnt[P[i]]++,x/=P[i];
if(x!=1) cnt[x]++;
}
lint ans=1;
for(it=cnt.begin();it!=cnt.end();it++) ans*=C[it->second+n-1][n-1],ans%=H;
printf("%lld
",ans);
return 0;
}
```
##P.S.
我VisJiao就是打死,也不吃STL一口饭!
...真香]