传送门:http://codeforces.com/contest/396/problem/A
题解:首先将最终的数因式分解,然后将就是将每个因式的次数看作相同的小球,n看作不同的盒子,也就是次数个相同的小球放入n个不同的盒子,用隔板法求出,隔板为n-1,球为次数x,值为A(n-1+x)/(A(n-1)*A(x))
AC代码
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define N 100007
#define mod 1000000007
__int64 fac[N];
__int64 ifac[N];
int prime[N];
int primesize;
int check[N];
map<int, int> cnt;
void init1()
{
for(int i=2;i<N;++i)
{
if(check[i]==0)
prime[primesize++]=i;
for(int j=0;j<primesize;++j)
{
if(i*prime[j]>=N) break;
check[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
long long power_moudle(long long p,long long t)
{
long long ans=1;
while(t>0)
{
if(t&1)
ans=ans*p%mod;
p=p*p%mod;
t=t/2;
}
return ans%mod;
}
void init2()
{
fac[0]=fac[1]=1;
for(int i=2;i<=100000;++i)
fac[i]=fac[i-1]*i%mod;
ifac[100000]=power_moudle(fac[100000],mod-2);
for(int i=99999;i>=0;--i)
ifac[i]=ifac[i+1]*(i+1)%mod;
}
long long C(long long n,long long m)
{
long long a=1;
long long b=1;
for(int i=n-m+1;i<n+1;++i)
a*=i,a%=mod;
for(int i=1;i<m+1;++i)
b*=i,b%=mod;
return a*power_moudle(b,mod-2)%mod;
}
void Divide(int n) {
int m = sqrt(n) + 1;
FOR(i, 2, m) {
if (n % i) continue;
int count = 0;
while (n % i == 0) {
count++;
n /= i;
}
cnt[i] += count;
}
if (n > 1) cnt[n]++;
}
int main()
{
memset(check,0,sizeof(check));
primesize=0;
init1();
init2();
int n;
cin>>n;
int x;
for(int i=1;i<=n;++i)
{
/*
cin>>x;
for(int j=0;j<primesize;++j)
{
if(x==1)
break;
while(x%prime[j]==0)
{
cnt[j]++;
x/=prime[j];
}
}
*/
cin>>x;
Divide(x);
}
__int64 res=1;
for(auto i:cnt)
{
res=res*fac[i.second+n-1]%mod*ifac[n-1]%mod*ifac[i.second]%mod;
res%=mod;
}
cout<<res<<endl;
return 0;
}
//10
//2097152 67108864 65536 262144 262144 131072 8388608 536870912 65536 2097152