您的位置:首页 > 其它

Coderforces 396A

2015-03-16 21:03 183 查看
  组合数学,给出n个数,ai,然后取这n个数的积为m,计算将m分解成n个因子,问有多少种有序因子序列。

  需要知道几个基本知识,c(n,m)=c(n-1,m-1)+c(n-1,m),讲n个物品分k份,每份至少一个物品,c(n-1,k-1)。

#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
map<int,int> h;
const int mod=1000000007;
long long c[20000][510]={0};
int main()
{
long long n,e,ans=1;
scanf("%lld",&n);
c[0][0]=1;
for(int i=1;i<=17000;i++){
for(int j=0;j<i&&j<=n;j++){
if(!j) c[i][j]=1;
else c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
c[i][i]=1;
}
for(int i=1;i<=n;i++) {
scanf("%lld",&e);
int j=1;
while(j*j<=e){//若让判定条件为e大于1则会超时
j++;
while(e%j==0){
e/=j;
h[j]++;
}
}
if(e>1) h[e]++;
}
for(map<int,int>::iterator ite=h.begin();ite!=h.end();ite++){
int k=ite->second;
ans=(ans*c[k+n-1][n-1])%mod;
}
cout<<ans<<endl;
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学